$scope.$watch('numRuns', function(newVal, oldVal) {
if (newVal === oldVal) return;
updateNumResults();
});
function updateNumResults() {
$scope.resultSet.size($scope.numRuns);
console.log("updateNumResults called");
}
ResultSet中的size方法看起来像:
function size(n) {
if (n === undefined) return numResults_; // no arg => using as getter
numResults_ = n;
return this;
}
我认为我有:
Number of runs: <input ng-model="numRuns"/>
在我的指令中,我有:
scope.$watch('resultSet', function(newVal, oldVal) {
console.log("change in result set");
createFromScratch();
}, true); // use object equality
如果在浏览器中的输入框中键入内容,则会看到输出“ updateNumResults named”,但未调用resultSet
上的实际监视。我已经验证了对对象resultSet
的确是由于对size()
的调用而发生了突变,并且由于我已经将watch
参数设置为objectEquality
来设置了true
,所以我的理解是应该将更改更改为拿起并触发watch
。为什么没有发生这种情况,我该如何实现呢?
更新
创建了一个简单的计数器变量,每次在resultSet上调用任何mutator方法时,我都会手动更改此变量:
function updateNumResults() {
$scope.resultSet.size($scope.numRuns);
$scope.resultSetChanged++;
console.log("updateNumResults called");
}
而且我在指令中观看:
function watchResultSet() {
scope.$watch('resultSetChanged', function(newVal, oldVal) {
console.log("change in result set");
createFromScratch();
});
}
此解决方案运行良好,并且可能占用较少的资源,但是我仍然想知道为什么原始解决方案无法正常工作。
使用JSBIN示例进行更新2