我有一个自定义指令,编码如下:
angular.module('client.core.directives')
.directive('containerlayout', function () {
function link(scope, el, attr) {
scope.$watch(['xdim', 'ydim', 'numOrder'], function () {
console.log("Watch Xdim/Ydim/numOrd change");
// do something when these changesd
}, true);
scope.$watch('labels', function (labels) {
// do something when labels array changes
}, true);
}
return {
link: link,
restrict: 'E',
scope: { geometry: '=geometry', xdim: '=xdim',
ydim: '=ydim', numOrder: '=numorder', labels: '=labels',
states: '=states', emptyToSkipped: '=emptytoskipped' }
};
我有以下声明:
<containerlayout geometry="rect" xdim="cont.xdim"
ydim="cont.ydim" numorder="1" labels="cont.labels"
states="cont.states" emptytoskipped="emptytoskipped"
class="ng-isolate-scope"></containerlayout>
但是当我改变时,比如$ scope.cont.xdim或其他一些变量,没有任何反应,手表也没有发射。
请注意,xdim和ydim是整数,标签是数组。
我应该如何在指令中声明内容,以便观察变量?他们是否需要在控制器中首先进行初始化才能成功完成工作?如果可能的话,我需要保持孤立的范围。
答案 0 :(得分:1)
$watch('propertyName', func)
仅关注一个$scope.propertyName
。
如果您想要观看多个属性,则需要$watchCollection('[propertyName, anotherPropertyName]', func)
。
scope.$watchCollection('[xdim, ydim, numOrder]', function (valuesArray) {
console.log("Watch Xdim/Ydim/numOrd change", valuesArray);
}, true);
labels
观察者会在您的示例中触发吗?它应该,因为它只是一个包含数组的属性。