Javascript AngularJS:未触发范围监视,即使objectEquality=true
在我的控制器中,我有:Javascript AngularJS:未触发范围监视,即使objectEquality=true,javascript,html,angularjs,angularjs-scope,Javascript,Html,Angularjs,Angularjs Scope,在我的控制器中,我有: $scope.$watch('numRuns', function(newVal, oldVal) { if (newVal === oldVal) return; updateNumResults(); }); function updateNumResults() { $scope.resultSet.size($scope.numRuns); console.log("updateNumResults called"); }
$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"/>
如果我在浏览器的输入框中键入,我将看到输出“updateNumResults called”,但不会调用resultSet
上的实际监视。我已经验证了对象resultSet
确实由于调用size()
而发生了变异,并且由于我已经将objectEquality
参数设置为true
,所以我的理解是应该拾取更改并触发监视。为什么没有发生,我怎样才能做到
更新
我做了以下更改以使其正常工作:
创建了一个简单的计数器变量,每次调用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
绍伯的想法是正确的。问题在于私人VAR
我猜您已经将指令配置为具有单独的隔离作用域(您已经向scope参数传递了散列)。由于您已在指令的作用域中配置了监视,因此需要确保此作用域与控制器作用域相同,或者继承它
有关更多信息,请阅读(特别是关于范围配置的内容)。此答案基于问题中的一些讨论:
如果resultSet
对象发生变异,此代码将起作用。在查看了size
方法之后,它似乎只是在修改resultSet
的构造函数中的一些私有变量。resultSet
对象本身没有更改,因此从未触发过$watch
。您在指令中配置了什么范围?我不确定是否理解您的问题,但我显示的代码片段来自链接(scope,elm,attrs)
方法,该方法作为“链接”返回属性。您是否也为指令配置了作用域,或仅配置了链接函数?例如,您可能有scope:true或scope:{…},size
方法是什么样子的?如果您可以提供包含输入和指令的HTML,以及size()
的实现,这会有所帮助。当然,用最少的小提琴或弹琴来显示问题是最好的。@Jonah-这个答案可能对将来的人有用。一般来说,我不建议OPs请求删除答案,除非答案应该是评论或非常离题。@halfer,这个答案应该是评论。这是对某件事的猜测,结果与我的问题毫无关系。当给出这样的答案时,特别是作为第一个答案时,他们会从流量上转移到可能会得到合法答案的问题上。我会说这太重要了,无法发表评论,尽管我不知道这个话题。但是,要善待你的对话者——通常他们只是想帮忙@哈弗,我什么时候不好?在解释了为什么他的答案不相关后,我礼貌地要求他删除这个问题。我非常感激我在这里得到的所有帮助,甚至是那些不起作用的帮助。但我的主要目标仍然是得到一个正确的答案,而这个答案与这个目标适得其反!我已经用正确的链接更新了OP,并将你的想法归功于私人VAR的问题。你可能想用你以前关于私人VAR的答案来更新这个答案,只是为了避免将来的混乱,然后我会接受它。谢谢。我删掉了最后一部分,因为它现在不适用,因为我已经修复了OP中的链接,这些链接显示了正确假设的测试用例
function watchResultSet() {
scope.$watch('resultSetChanged', function(newVal, oldVal) {
console.log("change in result set");
createFromScratch();
});
}