【发布时间】:2013-08-13 19:53:05
【问题描述】:
我在 AngularJS github 上发布了 an issue,但它似乎并没有引起很多关注,而且我无法自己修复它,因为这是一个非常低级的问题,所以我认为是时候了寻找解决方法。
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" 工作正常并输出Hello!,但ng-bind="getHello()" 输出[object Object],因为内部$watch 返回promise 对象。使用 $q 而不是 $.Deferred 的工作方式相同。
在我的实际代码中,我在第一次调用函数时创建了 Promise,所以我不能只是预先做出 Promise 并在范围内引用它。
我还需要它不仅仅是 ng-bind,所以我自己的绑定指令来正确处理这种情况是不可行的。
有人有什么想法吗?如果数据尚未解决,我目前正在返回承诺,如果有,则返回实际结果,但使用起来很痛苦。任何绑定到数据的东西都会在加载数据时短暂地引起奇怪的副作用,例如 ngRepeat 使用 promise 对象而不是解析的值来创建元素。
谢谢。
更新:拉取请求:https://github.com/angular/angular.js/pull/3605
更新 2:为了将来参考,自动承诺解包已在 1.2 分支中被弃用。
【问题讨论】:
-
ng-bind 接受一个表达式而不是一个函数。这是由 $parse 模块决定的。
-
函数调用是有效的表达式,你不能在双向绑定中使用它们。如果
getHello()返回一个字符串而不是一个承诺,它会正常工作。
标签: angularjs angularjs-scope promise