Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:未触发范围监视,即使objectEquality=true_Javascript_Html_Angularjs_Angularjs Scope - Fatal编程技术网

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();
        });
      }