2013-03-11 12 views
12

ich etwas offensichtlich hier bin fehlt. In meiner Direktive habe ich eine funktionierende bidirektionale Datenbindung, aber ich kann $ scope nicht verwenden. $ Watch() um Änderungen zu überwachen, die im js-Objekt des übergeordneten Bereichs auftreten können.

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

Wie Sie sehen können, wenn ich versuche, zu beobachten $ zu verwenden, um auf attrs.dirModel der resultierende Wert ist nicht definiert und es wird nichts weiter beobachtet, auch wenn ich das Objekt nach einer kurzen Verzögerung werde ändern. Ich habe auch versucht, das wahre Flag auf der $ watch-Anweisung zu verwenden (und nicht zu verwenden).

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> 

JS:

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); 
       } 
      } 
     } 
}]); 

Antwort

19

Da Sie verwenden '=', haben Sie eine lokale Richtlinie Anwendungsbereich Eigenschaft dirModel. Nur $ Uhr, dass:

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

Vielen Dank. Kennen Sie zufällig eine gute Ressource, um mehr über die "Eigenschaft der lokalen Direktiven" zu erfahren? Zuvor habe ich nur Beispiele gesehen, die auf das Attribut arguments zugreifen. Finale JS Geige für Benutzer Referenz. http://jsfiddle.net/Kzwu7/8/ – BradGreens

+0

@BradGreens, na ja, ist es auf der nicht-so-einfach zu verstehen [Richtlinien Seite] erwähnt (http://docs.angularjs.org/guide/directive) unter dem Abschnitt "Definitionsobjekt Richtlinie". Siehe auch http://stackoverflow.com/questions/14050195/what-is-the-difference-between-and-in-directive-scope/14063373#14063373, http://stackoverflow.com/questions/14908133/what- ist-der-Differenz-zwischen-vs-und-in-AngularJS und http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs/14049482 # 14049482 (siehe Abschnitt "Direktiven" unten). –

+0

Ich habe es schon oft gelesen;). Ich denke jetzt bin ich speziell daran interessiert zu lernen, welche Winkelmethoden diese String-Repräsentation des Attributs als Parameter akzeptieren. das heißt beobachten $ ('attr', fct), $ Satz ('attr', 'val'), $ Uhr ('attr', fct) etc ... Die Stringdarstellung Art magische ist. – BradGreens

Verwandte Themen