2013-03-11 7 views
12

मुझे यहां कुछ स्पष्ट याद आ रही है। मेरे निर्देश में मेरे पास दो-तरफा डेटा बाध्यकारी काम कर रहा है, हालांकि मैं $ scope का उपयोग नहीं कर सकता। $ Watch() निर्देशों के माता-पिता के दायरे जेएस ऑब्जेक्ट पर होने वाले परिवर्तनों की निगरानी करने के लिए।

http://jsfiddle.net/Kzwu7/6/

आप देख सकते हैं जब मैं $ का उपयोग attrs.dirModel पर देखने के परिणामस्वरूप मूल्य अपरिभाषित है और कुछ भी नहीं आगे देखा है, भले ही मैं कुछ विलंब के बाद वस्तु को संशोधित कर रहा हूँ करने के लिए प्रयास करें। मैंने $ घड़ी कथन पर सही ध्वज का उपयोग करने (और उपयोग नहीं) का भी प्रयास किया है।

HTML:

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.min.js"></script> 

<div ng-app="test" ng-controller="MainCtrl"> 
    <dir dir-model="model"></dir> 
    <p>{{model.tbdTwoWayPropA}}</p> 
</div> 

<script type="text/ng-template" id="template"> 
    <div class="test-el">{{dirModel.tbdTwoWayPropB}}</div> 
</script> 

जे एस:

var app = angular.module('test', []); 

app.controller("MainCtrl", [ 
    "$scope", "$timeout", 
    function($scope, $timeout){ 
     $scope.model = { 
      tbdTwoWayPropA: undefined, 
      tbdTwoWayPropB: undefined, 
      tbdTwoWayPropC: undefined 
     } 

     // TBD Ajax call 
     $timeout(function(){ 

      // alert("Model updated, but $scope.$watch isn't seeing it."); 

      $scope.model.tbdTwoWayPropA = 1; 
      $scope.model.tbdTwoWayPropB = 30; 
      $scope.model.tbdTwoWayPropC = [{ a: 1 },{ a: 2 },{ a: 3 }]; 

     }, 2000) 
    } 
]); 

app.directive('dir', [ 
    "$timeout", 
    function($timeout) { 
     return { 
      restrict: "E", 
      controller: function($scope){ 
       $scope.modifyTwoWayBindings = function(){ 

        // Two-way bind works 
        $scope.dirModel.tbdTwoWayPropA = 2; 
       } 

       $timeout(function(){ 
        $scope.modifyTwoWayBindings(); 
       }, 4000); 
      }, 
      scope: { 
       dirModel: '=' 
      }, 
      template: $("#template").html(), 
      replace: true, 
      link: function($scope, element, attrs) { 

      $scope.$watch(attrs.dirModel, handleModelUpdate, true); 

       // alert(attrs.dirModel); 

       function handleModelUpdate(newModel, oldModel, $scope) { 
        alert('Trying to watch mutations on the parent js object: ' + newModel); 
       } 
      } 
     } 
}]); 

उत्तर

19

आप '=' का उपयोग कर रहे हैं, आप एक स्थानीय निर्देश गुंजाइश संपत्ति dirModel है। बस $ देखें कि:

$scope.$watch('dirModel', handleModelUpdate, true); 
+0

धन्यवाद। क्या आपको "स्थानीय निर्देश स्कोप संपत्ति" के बारे में और जानने के लिए एक अच्छा संसाधन पता है। पहले मैंने केवल विशेषता तर्क तक पहुंचने वाले उदाहरण देखे हैं। उपयोगकर्ताओं के संदर्भ के लिए अंतिम जेएस fiddle। http://jsfiddle.net/Kzwu7/8/ – BradGreens

+0

@ ब्रैडग्रीन, ठीक है, यह समझने में आसान नहीं है [निर्देश पृष्ठ] (http://docs.angularjs.org/guide/directive) "निर्देश परिभाषा वस्तु" अनुभाग के तहत। Http://stackoverflow.com/questions/14050195/what-is-the-difference-between-and-in-directive-scope/14063373#14063373, http://stackoverflow.com/questions/14908133/what- बीच-बीच-बीच-बनाम-इन-एंजुलरजेस, और http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs/14049482 # 14049482 (नीचे के अनुभाग "निर्देश" देखें)। –

+0

मैंने इसे कई बार पढ़ा है;)। मुझे लगता है कि अब मैं विशेष रूप से सीखने में रूचि रखता हूं कि कोणीय पद्धति पैरामीटर के रूप में विशेषता के इस स्ट्रिंग प्रस्तुति को स्वीकार करेगी। यानी, $ निरीक्षण ('attr', fct), $ set ('attr', 'val'), $ watch ('attr', fct) आदि ... स्ट्रिंग प्रस्तुति जादुई है। – BradGreens

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