Angularjs 角度未命中有时会更新绑定值

Angularjs 角度未命中有时会更新绑定值,angularjs,Angularjs,我们检测到一个奇怪的情况,有时angularJS无法更新绑定值。目前,我们知道如何解决问题,但不知道为什么会发生这种故障 有人有胶水吗?有缺陷的版本怎么了 常见的: app.factory("DATASOURCE", ["$resource", function ($resource) { return $resource(URL); }]); ... var self = this; // effective $scope self.service = DATASOURCE; 有

我们检测到一个奇怪的情况,有时angularJS无法更新绑定值。目前,我们知道如何解决问题,但不知道为什么会发生这种故障

有人有胶水吗?有缺陷的版本怎么了

常见的:

app.factory("DATASOURCE", ["$resource", function ($resource) {
    return $resource(URL);
}]);

...
var self = this;  // effective $scope
self.service = DATASOURCE;
有缺陷的版本

var self = this;
self.objectRequest = self.service.get();
self.objectRequest.$promise.then(function(pRes) {
    self.objectTree = pRes; // resolve or not 8-(
})
此版本第一次按预期工作。以下调用有时会显示这种奇怪的行为:

但是,pRes使用调试器检查了新值, 绑定值仍显示以前的状态

 {{objectTree.head}}
调试器既不报告失败也不报告异常

以后的调用可能会更新绑定值

解决方法:

var self = this;
self.objectRequest = self.service.get();
self.objectRequest.$promise.then(function(pRes) {
    self.objectTree.head = pRes.head; // resolve
    self.objectTree.table = pRes.table; // resolve
    self.objectTree.messages = pRes.messages; // resolve
})

我们想了解出了什么问题。

请制作一个复制错误行为的plunker。简单的猜测是更新是在angular生命周期之外完成的。这取决于如何将objectTree绑定到$scope或controller。我认为您只需要添加$scope.apply或$scope.digest。此处显示的代码太少,无法帮助您。另一种猜测是,由于使用了ng if、switch、controller等,作用域实例可能会更改。您必须提供更多详细信息。不确定为什么要用回调结果覆盖objectTree。。。?可能会通过创建一个新的自变量来保存视图数据来解决这个问题;另外,将您的承诺/服务排除在$scope之外,这是我所遵循的一条一般规则。可能是因为您正在重用相同的$promise对象而造成的问题?我以为承诺只能解决一次。