我有一个看起来像这样的指令(省略了相关部分):
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
并没有获得新值。
非常感谢任何帮助。
答案 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);
有效。