12

我正在使用ng-show一个表达式,该表达式解析为一个解析为布尔值的 Promise。当我这样做时,我得到 10 次摘要迭代溢出。

http://plnkr.co/edit/XibYM0kCnXhKjNUeTsp3?p=preview

  <body ng-controller="MainCtrl">
    <p ng-show="returnsABoolean()">non promise</p>
    <p ng-show="returnsAPromiseThatResolvesToABoolean()">promise</p>
  </body>

控制:

  $scope.returnsABoolean = ()->
    true

  $scope.returnsAPromiseThatResolvesToABoolean = ()->
    $q.when(false)

我知道这{{somePromise}}会解决,但{{returnsAPromiseThatResolvesToABoolean()}}似乎会导致同样的问题。

有任何想法吗?我希望这能奏效..

4

3 回答 3

7

AngularJS 自动解析模板绑定的承诺。但是,您应该使用 Promiseng-init来防止摘要循环在每次滴答时都返回一个新的 Promise。

<p ng-init="v=returnsAPromiseThatResolvesToABoolean()" ng-show="v">promise</p>
于 2013-09-06T22:05:01.057 回答
5

Plunker:http ://plnkr.co/edit/NvjP5qHafhyIWXXotBej?p=preview

这就像我认为你想要的那样工作。$q.when()返回一个promise对象,所以ng-show没有得到一个布尔值;它得到一个承诺对象。

更新模板:

  <body ng-controller="MainCtrl">
    <p ng-show="returnsABoolean()">non promise</p>
    <p ng-show="returnsAPromiseThatResolvesToABoolean">promise</p>
  </body>

更新控制:

  $scope.returnsABoolean = ()->
    true

  promise = $q.when(false)
  promise.then((val) ->
    $scope.returnsAPromiseThatResolvesToABoolean = val)
于 2013-09-06T21:49:15.117 回答
2

如果您在此处查看源代码,您将看到 promise 已解决nextTick,因此$scope下次 angular$digest循环时唯一的更改。但是您的函数在每个$digest周期都会返回一个新的承诺,而实际上从未获得前一个承诺的已解决值。

这也是这里讨论的一个老问题。

您可以通过在函数之外保持对您的承诺的“持久”引用来克服这个问题,就像我在这里所做的那样。

于 2013-09-06T21:58:46.240 回答