【问题标题】:AngularJS - binding/watching a function which returns a promiseAngularJS - 绑定/监视返回承诺的函数
【发布时间】: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);

Fiddle

这里使用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


【解决方案1】:

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

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

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

【讨论】:

  • 不幸的是,我使用的请求捆绑机制与 $resource 发出请求的方式不兼容。
【解决方案2】:

Pull request 合并,它应该在 1.2.0 中修复,所以我将其标记为答案。

【讨论】:

  • 正如问题更新本身所述,此功能在达到 1.2 稳定版之前已被删除。
猜你喜欢
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多