2013-08-31 7 views
24

के साथ निर्देश मैं एक निर्देश लिखने की कोशिश कर रहा हूं जो अलग-अलग दायरे और ngModel निर्देश का उपयोग करता है।पृथक गुंजाइश और एनजी-मॉडल

समस्या:
जब मॉडल निर्देश में अद्यतन किया जाता है तो कॉलर का मूल्य अपडेट नहीं हो रहा है।

HTML:

<test-ng-model ng-model="model" name="myel"></test-ng-model> 

निर्देशक:

app.directive(
    'testNgModel', [ 
    '$timeout', 
    '$log', 

function ($timeout, $log) { 

    function link($scope, $element, attrs, ctrl) { 
     var counter1 = 0, counter2 = 0; 

     ctrl.$render = function() { 
      $element.find('.result').text(JSON.stringify(ctrl.$viewValue)) 
     } 

     $element.find('.one').click(function() { 
      if ($scope.$$phase) return; 
      $scope.$apply(function() { 
       var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {}; 
       form.counter1 = ++counter1; 
       ctrl.$setViewValue(form); 
      }); 
     }); 
     $element.find('.two').click(function() { 
      if ($scope.$$phase) return; 
      $scope.$apply(function() { 
       var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {}; 
       form.counter2 = ++counter2; 
       ctrl.$setViewValue(form); 
      }); 
     }); 

     $scope.$watch(attrs.ngModel, function (current, old) { 
      ctrl.$render() 
     }, true) 
    } 

    return { 
     require: 'ngModel', 
     restrict: 'E', 
     link: link, 
     //if isolated scope is not set it is working fine 
     scope: true, 
     template: '<div><input type="button" class="one" value="One"/><input type="button" class="two" value="Two"/><span class="result"></span></div>', 
     replace: true 
    }; 

}]); 

डेमो: अगर Fiddle

अलग गुंजाइश यह सेट नहीं है ठीक काम करता है: fiddle

+1

'गुंजाइश: TRUE' एक अलग गुंजाइश नहीं बना है, यह एक नए बच्चे गुंजाइश है कि prototypically माता पिता दायरे से विरासत बनाता है, इसलिए कारण '$ parent.model' काम करता है। (जब हम 'स्कोप: {...}' सिंटैक्स का उपयोग करते हैं तो एक अलग गुंजाइश बनाई जाती है। यहां, एक नया बच्चा गुंजाइश भी बनाया गया है, लेकिन यह प्रोटोटाइपिक रूप से माता-पिता से प्राप्त नहीं होता है।) आम तौर पर, एक बच्चे का दायरा होना चाहिए एनजी-मॉडल के साथ प्रयोग किया जाता है क्योंकि आप एक घटक बना रहे हैं जिसे अन्य निर्देशों (यानी, एनजी-मॉडल) के साथ बातचीत करने की आवश्यकता है। तो मेरा सुझाव है कि आप अपने दूसरे, काम करने, बेवकूफ के साथ जाओ। –

+0

@MarkRajcok जो निर्देश मेरे लिए एक विकल्प नहीं है क्योंकि यह अधिक जटिल है और यह उस दायरे में कुछ कस्टम विशेषताओं को जोड़ता है जो माता-पिता के दायरे –

+0

के प्रदूषण का कारण बनेंगे ठीक है, 'स्कोप: सत्य' का उपयोग करें, लेकिन किसी ऑब्जेक्ट का उपयोग करें, एक आदिम नहीं: ''। [बेला] (http://jsfiddle.net/mrajcok/6ZaB5/)। –

उत्तर

12

के रूप में टिप्पणी में चर्चा की, यह आम तौर पर एनजी मॉडल के साथ एक बच्चे गुंजाइश (scope: true या scope: { ... }) का उपयोग करने की सलाह नहीं दी है। हालांकि, चूंकि अरुण को अतिरिक्त स्कोप गुण बनाने की आवश्यकता है, scope: true किसी ऑब्जेक्ट के साथ उपयोग किया जा सकता है, न कि आदिम। इस प्रोटोटाइप विरासत का लाभ उठाता है, तो $parent neeed नहीं है:

<test-ng-model ng-model="someObj.model" ...> 

fiddle

+0

क्या यह नए दायरे के बजाय अलग-अलग दायरे के साथ काम करना संभव है http://jsfiddle.net/arunpjohny/gbfNY/1/ –

+0

@ArunPJohny, मूल दायरे को अद्यतन नहीं किया जा रहा है - ध्यान दें कि '{{someObj। मॉडल | जेसन}} 'आउटपुट खाली है। स्कॉप्स और एनजी-मॉडल को अलग करने के बारे में अधिक जानकारी के लिए, http://stackoverflow.com/questions/11896732/ngmodel-and-component-with-isolated-scope देखें। –

7

क्योंकि आपके द्वारा बनाए गए एक आईएसओ लेटेड स्कोप, एनजी मॉडेल = "मॉडल" आपके नए पृथक दायरे को संदर्भित करता है। आप अपने AppController दायरे का उल्लेख करना चाहते हैं, तो आप $ माता-पिता का उपयोग करना चाहिए:

<test-ng-model ng-model="$parent.model" name="myel"></test-ng-model> 
+2

'दायरा: सत्य 'एक अलग दायरा नहीं बनाता है। –

+0

अच्छा बिंदु। मेरा समाधान वैसे भी काम करेगा, भले ही दायरा अलग न हो। लेकिन आपके द्वारा प्रस्तावित समाधान बहुत बेहतर है। –

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