我试图删除细节并使其相当普遍......
使用1.2 rc2我的代码工作正常,更新到1.2稳定并纠正$ parse更改后我遇到了绑定问题。在更新之前,以下代码没有任何问题。从html页面调用updateChildObject()
。
.when('/the-page/', {
controller: function($scope, serviceResults, FactoryService) {
$scope.object.childObject = serviceResults;
// this function used to work. Now assigns the function to the
// scope rather than the results
$scope.updateChildObject = function(args) {
$scope.object.childObject = FactoryService.getSomethingFromServer(args);
};
},
resolve: {
serviceResults: function(FactoryService) {
return FactoryService.getSomethingFromServer(args);
}
}
由于现在失败了($ scope.object.childObject似乎被设置为函数而不是结果)我相信解决它的合适方法是通过一个承诺。 (注意,服务本身正在成功使用promise。)但是,在解析promise时,我很难让$ scope更新。
我相信以下代码是正确的。 $ q被注入控制器。
...
$scope.updateChildObject = function(args) {
var defer = $q.defer();
defer.promise.then(function() {
return FactoryService.getSomethingFromServer(args);
});
$scope.object.childObject = defer.resolve();
};
...
所以有人能说出我在这里做错了吗?承诺只是那些尚未真正为我点击过的东西之一。
答案 0 :(得分:2)
作为您答案的替代方案:您说FactoryService已经成功使用了承诺,在这种情况下,您似乎也不需要updateChildObject
中的额外承诺。您可以更新FactoryService.getSomethingFromServer(args)
以返回承诺(即最后使用return defer.promise;
并在异步位中使用defer.resolve(results);
),然后将updateChildObject
简化为:
$scope.updateChildObject = function(args) {
FactoryService.getSomethingFromServer(args).then(function(results) {
$scope.object.childObject = results;
}
};
此外,值得了解Angular 1.2故意破坏早期版本中的自动承诺展开:https://github.com/angular/angular.js/issues/4158。以前是这个代码
的情况$scope.updateChildObject = function(args) {
$scope.object.childObject = FactoryService.getSomethingFromServer(args);
};
与上面的相同(假设getSomethingFromServer返回一个promise),但不再是。这可能是您在1.2
中遇到的问题答案 1 :(得分:0)
弄清楚我做错了什么。绝对是一个承诺问题,因为我没有正确使用它们。以下解决了这个问题:
...
$scope.updateChildObject = function(args) {
var defer = $q.defer();
defer.promise.then(function(results) {
$scope.object.childObject = results;
});
defer.resolve(FactoryService.getSomethingFromServer(args));
};
...
所以defer.resolve会调用要解决的问题。 promise.then()将结果传递给下一个动作。这么简单。