Angularjs $watch不在内部工作指令

Angularjs $watch不在内部工作指令,angularjs,Angularjs,我有一个指令,看起来像这样(不相关的部分省略): projectds的值以[]开头,因此,正如我所期望的,首先记录的是[] 令人困惑的是,projectds在片刻之后由一个XHR请求填充,但该值从未被提取 我的模板如下所示: {{ reports.included_project_ids }} <rg-report-container project-ids="reports.included_project_ids"></rg-report-container> {{

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

projectds
的值以
[]
开头,因此,正如我所期望的,首先记录的是
[]

令人困惑的是,
projectds
在片刻之后由一个XHR请求填充,但该值从未被提取

我的模板如下所示:

{{ reports.included_project_ids }}
<rg-report-container project-ids="reports.included_project_ids"></rg-report-container>
{{reports.included_project_ids}
我可以在模板中看到
报告。包含的项目ID
从空变为不空。有一点我可以清楚地看到
报告。包含的项目ID
有数据,但在这一点上,我的
$scope.$watch
没有获取新值


非常感谢您的帮助。

我想出来了。这是因为在我的控制器中,我正在填充
报告。通过

reports.included_project_ids.push(project.id);
显然,
push
不会触发
$watch

一旦我把它换成下面这样的东西,它就成功了

var projectIds = [];
projectIds.push(project.id);
reports.included_project_ids = projectIds;
Edit:我意识到我的问题是由于默认情况下,
$watch
没有“深入”检查相等/不相等。为了使
$watch
对数组正常工作,必须将
true
作为第三个参数传递给
$watch

以下是
$watch
表单的函数签名:

因此,我决定保留我原来的
推送
代码,并将我的
$watch
更改为:

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

那就行了。

它应该会着火,你能重现这个问题吗?仅供参考,在这里使用Promissions可能比$watch更好。@Casey你可能是对的,但由于遗留代码的结构,在这种情况下不可能。我在侦听数组更改时使用了$watchCollection,尤其是添加/删除项目。你可以在这里简单回顾一下它和deep$watch的区别
$watch(watchExpression, listener, [objectEquality]);
$scope.$watch('projectIds', function(projectIds) {
  console.log(projectIds);
}, true);