2013-08-23 12 views
6

के लिए कस्टम इंटरपोलेशन प्रतीकों का उपयोग करते हैं। वर्तमान में मेरे पास अंडरस्कोर.जेएस टेम्पलेट है जो मैं कोणीय के साथ उपयोग करना चाहूंगा और अभी भी अंडरस्कोर के साथ उपयोग करने में सक्षम हूं। मैं सोच रहा था अगर यह संभव है इस तरह एक निर्देश का उपयोग कर एक विशेष क्षेत्र के लिए प्रक्षेप आरंभ और अंत प्रतीकों को बदलने के लिए,:एंगुलरज स्कोप

angular.directive('underscoreTemplate', function ($parse, $compile, $interpolateProvider, $interpolate) { 
    return { 
     restrict: "E", 
     replace: false, 
     link: function (scope, element, attrs) { 
      $interpolateProvider.startSymbol("<%=").endSymbol("%>"); 
      var parsedExp = $interpolate(element.html()); 
      // Then replace element contents with interpolated contents 
     } 
    } 
}) 

लेकिन इस त्रुटि

Error: Unknown provider: $interpolateProviderProvider <- $interpolateProvider <- underscoreTemplateDirective

$interpolateProvider के लिए ही उपलब्ध है बाहर थूक मॉड्यूल विन्यास? <%= से {{ और %> से }} को बदलने के लिए स्ट्रिंग प्रतिस्थापन का उपयोग करने का बेहतर समाधान होगा?

इसके अलावा, मैंने देखा है कि element.html() निकल जाता <%= में < और %> में >। क्या इस स्वचालित भागने से बचने का कोई तरीका है?

उत्तर

2

ठीक है, आपके यहां कुछ समस्याएं हैं, लेकिन मुझे आपके लिए का समाधान मिला।

डेमो

http://jsfiddle.net/colllin/zxwf2/

अंक 1

आपका < और > पात्रों &lt; और &gt;, करने के लिए परिवर्तित किया जा रहा है तो जब आप element.html() कहते हैं, तुम भी की एक आवृत्ति प्राप्त नहीं कर सकेंगे उस स्ट्रिंग में < या >

समस्या 2

के बाद से $interpolate सेवा पहले से ही किया गया $interpolateProvider द्वारा "प्रदान" है, ऐसा लगता है startSymbol और endSymbol संपादित कर सकते हैं नहीं लगती है। हालांकि, आप अपने कस्टम स्टार्ट सिंबल और एंडसिंबोल को अपने लिंकिंग फ़ंक्शन में गतिशील रूप से कोणीय प्रारंभ/अंत प्रतीकों में परिवर्तित कर सकते हैं।

समाधान

myApp.directive('underscoreTemplate', function ($parse, $compile, $interpolate) { 
    return { 
     restrict: "A", 
     link: function(scope, element, attrs) { 
      var startSym = $interpolate.startSymbol(); 
      var endSym = $interpolate.endSymbol(); 
      var rawExp = element.html(); 
      var transformedExp = rawExp.replace(/&lt;%=/g, startSym).replace(/&lt;%-/g, startSym).replace(/%&gt;/g, endSym); 
      var parsedExp = $interpolate(transformedExp); 

      scope.$watch(parsedExp, function(newValue) { 
       element.html(newValue); 
      }); 
     } 
    } 
}); 

वैकल्पिक

मुझे यकीन है कि कैसे नहीं हूँ, लेकिन मैं वहाँ अपने स्वयं के कस्टम $interpolate सेवा का उपयोग करने का दृष्टांत के लिए एक रास्ता है यकीन है कि $interpolateProvider (अंडरस्कोर टैग के लिए यह कॉन्फ़िगर करने के बाद) ।

+1

धन्यवाद, यह बहुत अच्छा काम करता है! मैंने सभी मामलों को बदलने के लिए एक छोटा सा परिवर्तन किया ('जी' के साथ रेगेक्स का उपयोग करें): http://jsfiddle.net/e3s5d/ –

+0

ग्रेट कॉल। अद्यतन उत्तर – colllin

+0

अब जब आप '<% -' वाक्यविन्यास को इंगित करते हैं, तो मुझे एहसास हो रहा है कि अंडरस्कोर में डिफ़ॉल्ट '<% =' कोणीय के '

' के समान है। शायद आप '
' 'के साथ कच्ची अभिव्यक्ति में '' <% = '' को बदलकर अनचाहे एचटीएमएल को अनुमति देने के लिए इस निर्देश में कुछ तर्क जोड़ सकते हैं। संदर्भ: http://stackoverflow.com/a/10971756/361609 – colllin

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