2013-03-13 18 views
11

के साथ ngModel का उपयोग करते समय सर्वोत्तम प्रथाएं यहां मेरी समस्या है। ,कोणीयजेएस निर्देश - jQuery विजेट

module.directive('myWidget', [function() { 
    return { 
     require: "ngModel", 
     restrict: "A", 
     replace: true, 
     templateUrl: "templates/myWidget.html", 
     link: function(scope, element, attrs, ctrl) { 
      element.widget_name().on('value_updated', function(event) { 
       scope.$apply(function() { 
        var newModelValue = event.some_value; 
        ctrl.$setViewValue(newModelValue); 
       }); 
      }); 

      scope.$watch(attrs["ngModel"], function(value){ 
       element.widget_name('set_value', value); 
      }); 
     } 
    }; 
}]); 

तो अगर मॉडल के मूल्य में परिवर्तन, तो हैंडलर जो $ घड़ी का उपयोग मॉडल के बदलावों को सुनने के लिए पंजीकृत है निष्पादित किया जाएगा: उदाहरण के लिए, हम निम्न निर्देश है, जो पर्दे के पीछे कुछ jQuery विजेट का उपयोग करता है , और, इसके परिणामस्वरूप, विजेट की 'set_value' विधि भी निष्पादित की जाएगी। इसका मतलब है कि 'value_updated' ईवेंट ट्रिगर किया जाएगा।

मेरा प्रश्न है: डीओएम इवेंट हैंडलर और वॉचर्स की अतिरिक्त कॉल से बचने के लिए निर्देशों में समान व्यवहार को लागू करने का सबसे अच्छा अभ्यास क्या है?

उत्तर

4

scope.$watch() के बजाय, मैं ctrl.$render() को लागू करने का सुझाव देता हूं। $ रेंडर केवल तभी बुलाया जाना चाहिए जब कोणीय के अंदर कुछ मॉडल बदल देता है। Fiddle example

इससे कोई समस्या हल नहीं होती है जिसका आपने उल्लेख नहीं किया था। दुर्भाग्य से, यह आपके द्वारा उल्लेख की गई समस्या का समाधान नहीं करता है। पहेली में, blur घटना कुछ विजेट.ऑन() घटना के बजाए बाध्य है। शायद यह आपके लिए काम करेगा – यानी, प्रत्येक कीस्ट्रोक की बजाय केवल धुंध पर मॉडल अपडेट करें (यह मानता है कि आपका विजेट कीस्ट्रोक स्वीकार कर रहा है)।

शायद आप विजेट लेखक से "सेट" विधि प्रदान करने के लिए भी कह सकते हैं जो किसी ईवेंट को ट्रिगर नहीं करता है। फिर इसका उपयोग $ रेंडर() विधि में किया जा सकता है।

+0

धन्यवाद मार्क, आपका समाधान पूरी तरह से मेरी समस्या हल करता है। लेकिन क्या आप कृपया बता सकते हैं - जब यह देखने वालों के लिए उपयुक्त है और जब $ कार्यान्वयन प्रदान करता है? – oaleynik

+2

@oaleynik, $ rendnder() को तब भी लागू किया जाना चाहिए जब भी आप कुछ करना चाहते हैं क्योंकि कोणीय के अंदर एक एनजी-मॉडल मान बदल दिया गया था। एनजी-मॉडल स्वचालित रूप से हमारे लिए घड़ी सेट करता है, और $ रेंडर() को कॉल किया जाता है यदि यह बदलाव को नोटिस करता है। तो सामान्य रूप से, एनजी-मॉडल के साथ, आप अपनी खुद की $ घड़ी का उपयोग करने के बजाय $ रेंडर लागू करना चाहते हैं। –

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