2016-11-14 58 views
0

语境观看指令范围不工作

我控制器存储阵列。当按下键盘上的特定快捷键时,我会向该阵列添加一个新对象。

该数组用于指令内部以显示图表。

因此,按快捷键时,图表应更新为新值。

控制器

vm.observation = [{ 
    "sale": "202", 
    "year": "2010" 
}, { 
    "sale": "215", 
    "year": "2011" 
}, { 
    "sale": "179", 
    "year": "2012" 
}, { 
    "sale": "199", 
    "year": "2013" 
}, { 
    "sale": "134", 
    "year": "2014" 
}, { 
    "sale": "176", 
    "year": "2015" 
}]; 

指令

angular.module('spwApp.directives') 
    .directive('linechart', [function() { 
     return { 
      restrict: 'E', 
      scope: { 
       id: "@", 
       observation: "=" 
      }, 
      link: function($scope, element, attrs) { 
       $scope.$watch("observation", function(newVal, oldVal){ 
        console.log("OBS : " + newVal); 
       }, true); 
      } 
     } 
    }]) 

HTML

<linechart id="linechart3" observation="vm.observation"></linechart> 

当页面负载第电子海图正确显示数据和控制台正确执行日志$watch正确执行。

反正按$watch,而阵列更新

我无法找到我的代码错误

+0

尝试使用$ watchCollection而不是$ watch – George

+0

@Sajeetharan它现在进入'$ watch()'内部,但产生这个错误'$ apply already progress' – Weedoze

+0

@GeorgeLee它似乎工作。你可以请帖并回答解释吗? – Weedoze

回答

2

你添加了一些阵列则不会触发快捷方式,但后面的阵列本身停留在相同。一个普通的观察者只会对变化的值做出反应。这就是为什么角还提供$watchCollection

$scope.$watchCollection("observation", 

$watchCollection还监视所述阵列的内容,即,它会检查是否被删除或添加的东西。

+1

这很漂亮,使用$ watch来看数组仍然等于一个数组,所以没有改变,你也可以执行'$ scope。$ watch('observation',function(),true)'真的会做一个“深的“比较,但这与性能命中 – George

+0

@GeorgeLee你是正确的使用深度比较,但'$ watchCollection'更有效率/性能。 – zeroflagL