2013-04-05 12 views
14

Proszę odnieść się do tego skrzypce, aby uzyskać odpowiedzi na pytania. http://jsfiddle.net/AQR55/

1) Dlaczego zegarek dołączony do właściwości scope izolatu - który jest dwukierunkowo związany z właściwością macierzystą, nie jest wyzwalany przy zmianie właściwości rodzica.

W przypadku skrzypiec poniższy zegarek z określonymi wartościami nie jest wyzwalany po zmianie właściwości zakresu nadrzędnego, do którego jest związany.

$scope.$watch('acts', function(neww ,old){ 
        console.log(neww) 
       }) 

2) ng-click="addaction()" addaction="addaction()". Czy ten kod można umieścić w bardziej elegancki sposób? Ponieważ, aby wykonać akcję w odosobnionym zakresie, wydaje się, że musimy ustawić wiązanie dwukierunkowe i dołączyć do ng-click.

3) Czy mogę zadeklarować metody w odizolowanym zakresie, jak pokazano poniżej? Jeśli mi się to podoba, otrzymuję błąd .js.

<isolate-scope-creating-cmp ng-click="isolateCmpClickHandler()"></isolate-scope-creating-cmp> 
scope:{ 
    isolateCmpClickHandler:function(){ 
     //If i do like this, I'm getting .js error 

    } 
} 
+0

dlaczego jest drugi punkt używane? –

+0

Chcę ustawić obsługę zdarzeń dla przycisku. Jak wspomniano w trzecim punkcie, ponieważ nie mogę ustawić obsługi kliknięcia wewnątrz zakresu izolatu, musiałem ustawić jedną z funkcji zdefiniowanych w nadrzędnym zasięgu jako obsługę kliknięcia. Aby to zrobić, używam '&' do oceny 'addaction()' w obszarze nadrzędnym, a im używa tego atrybutu nadrzędnego, oceniając właściwość jako moduł obsługi kliknięcia za pomocą "ng-click". Jeśli usunę "addaction =" addaction() "" ng-click "nie działa. Skrzypce, które zaktualizowałeś dla pytania nr. 1 nie uruchamia się po kliknięciu przycisku. Proszę spojrzeć na firebuga. – rajkamal

Odpowiedz

20

Pytanie 1.
Od dodawania elementu do tablicy acts, trzeba ustawić trzeci parametr w $watch() do prawdziwej

$scope.$watch('acts', function (neww, old) { 
    console.log(neww) 
}, true); 

Demo: Fiddle

Pytanie 2
Ponieważ istnieje izolowany zakres, należy wywołać funkcję zakresu $parent w zakresie

<input type="button" bn="" acts="acts" ng-click="$parent.addaction()" value="Add Action" /> 

Demo: Fiddle

Pytanie 3.
Tak można, ale trzeba użyć kontrolera

animateAppModule.directive('bn', function() { 
    return { 
     restrict: "A", 
     scope: { 
      acts: '=' 
     }, 
     link: function ($scope, iElement, iAttrs) { 
      $scope.$watch('acts', function (neww, old) { 
       console.log(neww) 
      }, true) 
     }, 
     controller: function($scope){ 
      $scope.dosomething = function(){ 
       console.log('do something') 
      } 
     } 
    } 
}) 

Demo: Fiddle

Ogólnym rozwiązaniem mogłoby wyglądać

<input type="button" bn="" acts="acts" addaction="addaction()" value="Add Action" /> 

JS

animateAppModule.controller('tst', function ($scope) { 
    $scope.acts = []; 
    $scope.addaction = function() { 
     $scope.acts.push({ 
      a: "a,b" 
     }) 
    } 
}) 

animateAppModule.directive('bn', function() { 
    return { 
     restrict: "A", 
     scope: { 
      acts: '=', 
      addaction: '&' 
     }, 
     link: function ($scope, iElement, iAttrs) { 
      $scope.$watch('acts', function (neww, old) { 
       console.log(neww) 
      }, true); 
      iElement.click(function(){ 
       $scope.$apply('addaction()') 
      }) 
     } 
    } 
}) 

Demo: Fiddle

+2

odkąd kątowa zmiana monitora wykorzystuje kątowe.równania, które używają operatora ===, więc aby oglądać złożone obiekty, takie jak tablica, powinieneś przekazać wartość true z wyrażeniem zegarka, aby porównać dla równości obiektu zamiast odniesienia –

Powiązane problemy