AngularJS - 绑定/监视返回承诺的函数

2024-03-24

我已经发布an issue https://github.com/angular/angular.js/issues/3503在 AngularJS github 上,但它似乎没有得到太多关注,而且我无法自己修复它,因为这是一个相当低级的问题,所以我认为是时候寻找解决方法了。

Angular 允许你做出承诺(或者任何带有.then(...)function) 进入你的范围,一旦它被解析,所有 $watches 和任何绑定到该承诺的东西都将使用解析的值。当您使用函数返回 Promise 时,就会出现问题,因为这并不适用 - 它像普通对象一样处理。

例如:

var helloDef = $.Deferred();
$scope.hello = helloDef.promise();

$scope.getHello = function() {
    return $scope.hello;
};

$timeout(function() {
    helloDef.resolve('Hello!');
}, 1000);

Fiddle http://jsfiddle.net/xaQKE/3/

这里使用ng-bind="hello"工作正常并输出Hello!, but ng-bind="getHello()"输出[对象对象]因为内部 $watch 返回 Promise 对象。使用 $q 而不是 $.Deferred 的工作方式相同。

在我的实际代码中,我在第一次调用函数时创建承诺,因此我不能只预先制定承诺并在范围内引用它。

我还需要它不仅仅是 ng-bind,因此制作我自己的绑定指令来正确处理这种情况是不可行的。

有人有主意吗?如果数据尚未解决,我目前将返回承诺,如果已解决,则返回实际结果,但这很难处理。在加载数据时,绑定到数据的任何内容都会短暂地产生奇怪的副作用,例如 ngRepeat 使用 Promise 对象而不是解析值来创建元素。

Thanks.

UPDATE:拉取请求:https://github.com/angular/angular.js/pull/3605 https://github.com/angular/angular.js/pull/3605

更新2:为了将来参考,自动承诺展开已在 1.2 分支中被弃用。


对于某些事情,我使用 $resource。如果我需要等待,$then 效果很好:

var r = $resource...get...
var p = r.$then...

否则,我会构建自己的类似资源的对象,它不是一个承诺,但有一个我可以等待的承诺。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AngularJS - 绑定/监视返回承诺的函数 的相关文章

随机推荐