2012-09-02 12 views
32

क्या मौजूदा "मानक" फ़िल्टर (date, number, lowercase आदि) को विस्तारित करना संभव है? मेरे मामले में मुझे YYYYMMDDhhmms प्रारूप से तारीख का विश्लेषण करने की आवश्यकता है, इसलिए मैं अपना खुद का लिखने के बजाय date फ़िल्टर को विस्तारित (या ओवरराइड) करना चाहता हूं।कोणीय में मौजूदा फ़िल्टर को विस्तारित या ओवरराइड कैसे करें?

उत्तर

41

मुझे यकीन नहीं है कि मैं आपके प्रश्न को सही तरीके से समझता हूं, लेकिन यदि आप मौजूदा फ़िल्टर की कार्यक्षमता को विस्तारित करना चाहते हैं तो आप एक नया फ़िल्टर बना सकते हैं जो मौजूदा को सजाने वाला हो। उदाहरण:

myApp.filter('customDate', function($filter) { 
    var standardDateFilterFn = $filter('date'); 
    return function(dateToFormat) { 
    return 'prefix ' + standardDateFilterFn(dateToFormat, 'yyyyMMddhhmmss'); 
    }; 
}); 

और फिर, अपने टेम्पलेट में:

{{now | customDate}} 

ऊपर कहा है, अगर आप बस एक दिया प्रारूप इस मौजूदा तिथि फिल्टर के साथ किया जा सकता है के अनुसार एक तारीख स्वरूपित करना चाहते हैं : http://jsfiddle.net/pkozlowski_opensource/zVdJd/2/

:

{{now | date:'yyyyMMddhhmmss'}} 

यहाँ काम कर jsFiddle दोनों तकनीकों को दर्शाता हुआ है 210

कृपया ध्यान दें कि यदि प्रारूप निर्दिष्ट नहीं है तो AngularJS मान लेगा कि यह 'मध्यम' प्रारूप है (सटीक प्रारूप लोकेल पर निर्भर करता है)। अधिक के लिए http://docs.angularjs.org/api/ng.filter:date देखें।

अंतिम टिप्पणी: मैं आपके प्रश्न के 'पर्स से' हिस्से के बारे में थोड़ा उलझन में हूं। बात यह है कि फ़िल्टर का उपयोग ऑब्जेक्ट (इस मामले में दिनांक) को स्ट्रिंग करने के लिए और उपाध्यक्ष नहीं करने के लिए किया जाता है। यदि आप तिथियों का प्रतिनिधित्व करने वाले तारों (इनपुट से) को पार्स करने के बाद हैं तो आपको NgModelController # $ पार्सर्स में देखना होगा (http://docs.angularjs.org/guide/forms में "कस्टम सत्यापन" भाग देखें)।

+3

प्रलेखन तारीख फिल्टर के अनुसार आईएसओ 8601 से स्वरूपित स्ट्रिंग के रूप में दिनांक को स्वीकार कर सकते हैं:
ही फिल्टर

<p>Standard output : {{ now | date:'yyyyMMddhhmmss' }}</p> <p>External behavior : {{ now | date:'yyyyMMddhhmmss': ' My suffix' }}</p> 

यहाँ के साथ काम करने jsFiddle दोनों तकनीकों को दर्शाता हुआ है। मेरे मामले में इनपुट प्रारूप 'yyyyMMddHHmmss' है इसलिए मानक फ़िल्टर 'दिनांक' इसे पार्स नहीं कर सकता है। – coxx

69

मैं decorator pattern लागू करने के लिए पसंद करते हैं, और वास्तव में में कोणीय बहुत आसान है ..
तो, अगर हम ले @ pkozlowski.opensource उदाहरण के लिए, आप ऐसा ही कुछ कर सकते हैं:

myApp.config(['$provide', function($provide) { 
    $provide.decorator('dateFilter', ['$delegate', function($delegate) { 
    var srcFilter = $delegate; 

    var extendsFilter = function() { 
     var res = srcFilter.apply(this, arguments); 
     return arguments[2] ? res + arguments[2] : res; 
    } 

    return extendsFilter; 
    }]) 
}]) 

और फिर अपने विचारों में, आप मानक आउटपुट और विस्तारित व्यवहार दोनों का उपयोग कर सकते हैं। http://jsfiddle.net/ar8m/9dg0hLho/

+5

यह बिल्कुल 100% बिल्कुल है जो मुझे चाहिए था। अगर मैं कर सकता तो मैं आपको तीन बार वोट दूंगा। –

+1

यह सही उत्तर है। लेकिन याद रखें कि आपको उन्हें प्राप्त करने के लिए फ़िल्टर के लिए '' '' '' '' '' '' '' '' फ़िल्टर करना होगा। एक ही नाम के साथ एक फ़िल्टर को दोबारा बनाना मेरे द्वारा भी ठीक है, क्योंकि वे आमतौर पर (हमेशा?) एक समारोह होते हैं, आप किसी भी तरह से बदलने जा रहे हैं। –

+0

महान दृष्टिकोण। q: 'srcFilter.apply (...) 'का पहला पैरा' यह 'है, हालांकि मैंने अन्य उदाहरणों को देखा कि पहला पैराम' शून्य 'है। इसका उद्देश्य क्या है? –

संबंधित मुद्दे