• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

AngularJS推迟范围内的特定行为

angularjs 来源:ValeriiVasin 7次浏览

假设我们有一个这样的一些HTML:AngularJS推迟范围内的特定行为

<code class="prettyprint-override"><button 
    id="my-login-button" 
    ng-hide="loggedIn" 
    ng-click="login()">Log me in!</button> 
</code>

另外,我们有一个JavaScript:

<code class="prettyprint-override">// controller.js 
$scope.login = function() { 
    API.login() 
     .then(function() { 
     console.log('login promise resolved'); 
     }); 
}; 

// service.js 
app.factory('API', ['$q', '$timeout', function ($q, $timeout) { 
    return { 
    login: function() { 
     var login = $q.defer(); 

     // async login 
     VK.Auth.login(
     function() { 
      // login.resolve();  // doesn't work without $timeout() 
      $timeout(login.resolve); // works as it should 
     }, 
     VK.access.FRIENDS | VK.access.AUDIO 
    ); 

     return login.promise; 
    } 
    }; 
}]); 
</code>

这段代码工作正常,但神秘的部分靠近$timeout()功能。为什么我应该用我的决心来解决呢?为什么代码不按预期工作没有它?

我不对范围变量做些什么,我只是安慰。没有$timeout它将被称为下一个摘要…

至于我没有任何意义,如果我需要更改范围道具,我会包装一切在$apply

任何人都可以解释为什么通常的延期行为变得神秘吗?

P.S.在阅读this question answers后,我用$timeout解决了我的问题。

===========解决方案如下:

在AngularJS中,承诺结果是在$ digest循环内异步传播的。因此,then()的结果不会传播到下一个摘要循环,如果没有$timeout$http$apply触发一个循环,那么这个循环将永远不会发生。

另请参见Promise callback not called in Angular JS


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)