2013-04-05 79 views
14

請參考這個提琴的問題。 http://jsfiddle.net/AQR55/

1)爲什麼連接到隔離作用域屬性的手錶(雙向綁定到父屬性)不會觸發更改父作用域屬性。

在小提琴中,以下提到的手錶不會被觸發,因爲它將更改綁定到的父範圍屬性。

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

2)ng-click="addaction()" addaction="addaction()"。這個代碼可以用更優雅的方式嗎?因爲要在隔離範圍內執行某個操作,似乎需要設置雙向綁定和附加到ng-click。

3)我可以如下所示在隔離範圍內聲明方法嗎?如果我這樣做,我會得到.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

爲什麼使用第二點? – 2013-04-05 04:50:41

+0

我想爲按鈕設置事件處理程序。正如第三點所提到的,因爲我不能在隔離範圍內設置點擊處理程序,所以我不得不在父範圍中定義一個作爲點擊處理程序的函數。爲此,我使用'&'來評估父作用域中的addaction(),並使用'ng-click'使用該父作用域評估的屬性作爲點擊處理程序。如果我刪除'addaction =「addaction()」'ng-click'不起作用。您已更新問題編號的小提琴。 1不會觸發按鈕的點擊。請看看螢火蟲。 – rajkamal 2013-04-05 04:58:04

回答

20

問題1:
由於要添加項目到acts數組,你需要在$watch()設置第三個參數爲true

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

演示:Fiddle

問題2 。
由於存在隔離範圍,因此需要調用$parent示波器的功能

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

演示:Fiddle

問題3:
當然可以,但你需要使用控制器

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') 
      } 
     } 
    } 
}) 

演示:Fiddle

的整體解決方案可能看起來像

<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()') 
      }) 
     } 
    } 
}) 

演示:Fiddle

+2

由於角度監視器更改使用使用===運算符的angular.equals,因此要觀察像數組這樣的複雜對象,應該使用監視表達式傳遞true來比較對象的相等性,而不是參考 – 2013-04-05 05:35:15