在我的控制器中,我有:
$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 called”,但实际上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
Sh0ber 的想法是正确的。问题出在私有变量上。