$ watch在指令

时间:2016-11-23 14:43:12

标签: angularjs

我有一个看起来像这样的指令(省略了相关部分):

app.directive('rgReportContainer', function() {
  return {
    restrict: 'E',
    scope: {
      projectIds: '='
    },
    controller: controller
  };

  controller.$inject = ['$scope'];

  function controller($scope) {
    $scope.$watch('projectIds', function(projectIds) {
      console.log(projectIds);
    });
  }
});

projectIds的值以[]开头,因此我记录的第一件事就是[]

令人困惑的是,projectIds在一段时间后被XHR请求填充,但该值从未被提取。

我的模板看起来像这样:

{{ reports.included_project_ids }}
<rg-report-container project-ids="reports.included_project_ids"></rg-report-container>

我可以在模板中看到reports.included_project_ids从空变为非空。我可以清楚地看到reports.included_project_ids有数据,但此时我的$scope.$watch并没有获得新值。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我明白了。这是因为在我的控制器中,我通过执行

来填充reports.included_project_ids
reports.included_project_ids.push(project.id);

显然push不会触发$watch

一旦我将其切换为类似下面的内容,就可以了。

var projectIds = [];
projectIds.push(project.id);
reports.included_project_ids = projectIds;

修改:我意识到我的问题是由于$watch没有深入&#34;默认情况下检查是否存在相等/不等式。为了使$watch能够正常使用数组,您必须将true作为第三个参数传递给$watch

以下是$watch的{​​{1}}的功能签名:

$watch(watchExpression, listener, [objectEquality]);

所以我决定保留原来的push代码并将我的$watch更改为:

$scope.$watch('projectIds', function(projectIds) {
  console.log(projectIds);
}, true);

有效。