我在 AngularJS github 上发布了一个问题,但它似乎并没有引起很多关注,而且我自己也无法修复它,因为它是一个非常低级的问题,所以我认为是时候寻找一个解决方法。
Angular 允许你将一个 Promise(或任何带有.then(...)
函数的东西)放入你的作用域,一旦它被解析,所有的 $watches 和任何绑定到该 Promise 的东西都将使用解析后的值。当您使用函数返回承诺时会出现问题,因为同样不适用 - 它像普通对象一样处理。
例如:
var helloDef = $.Deferred();
$scope.hello = helloDef.promise();
$scope.getHello = function() {
return $scope.hello;
};
$timeout(function() {
helloDef.resolve('Hello!');
}, 1000);
在这里使用ng-bind="hello"
工作正常并输出你好!,但ng-bind="getHello()"
输出[object Object]作为内部 $watch 返回承诺对象。与 $q 而不是 $.Deferred 的工作方式相同。
在我的实际代码中,我是在第一次调用函数时创建承诺,所以我不能只预先做出承诺并在范围内引用它。
我还需要它不仅仅是 ng-bind,所以制作我自己的绑定指令来正确处理这种情况是不可行的。
有人有想法么?如果数据尚未解决,我目前正在返回承诺,如果已解决,则返回实际结果,但使用起来很痛苦。任何绑定到数据的东西都会在加载数据时短暂地产生奇怪的副作用,比如 ngRepeat 使用 promise 对象而不是解析的值来创建元素。
谢谢。
更新:拉取请求:https ://github.com/angular/angular.js/pull/3605
更新 2:为了将来参考,自动承诺解包已在 1.2 分支中被弃用。