带有promise表达式的angularjs ng-show

时间:2013-09-06 21:19:38

标签: javascript angularjs

我正在使用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()}}似乎会导致同样的问题。

有什么想法吗?我希望这可以工作..

3 个答案:

答案 0 :(得分:7)

AngularJS自动解决了模板绑定的承诺。但是,您应该使用ng-init中的promise来阻止摘要周期在每个tick中返回一个新的promise。

<p ng-init="v=returnsAPromiseThatResolvesToABoolean()" ng-show="v">promise</p>

答案 1 :(得分: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>

更新了Ctrl:

  $scope.returnsABoolean = ()->
    true

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

答案 2 :(得分:2)

如果您查看来源here,则会在nextTick中看到承诺已得到解决,因此$scope仅在下次有角度$digest时更改$digest 1}}循环。但是你的函数在每个{{1}}周期都会返回一个新的承诺,从来没有实际获得前一个承诺的已解析值。

这也是一个老问题here

你可以通过保持&#34;持久性来解决这个问题。参考你在函数之外的承诺here