2017-06-04 60 views
1

我正在学习angularjs,并尝试使用Promiseh3标签添加问候语。但它不起作用(没有错误日志)。如何在angularjs中使用控制器内的Promise?

angular.module('app', []).controller('test', function ($scope) { 
 
    $scope.greeting = 'Hello world!'; 
 
    
 
    let p1 = new Promise(r => r('Hi')); 
 
    let p2 = new Promise(r => r('Im Gosu')); 
 
    
 
    Promise.all([p1, p2]).then(p => { 
 
    $scope.greeting = `${p[0]} ${p[1]}`; 
 
    
 
    console.log(p[0]); 
 
    console.log(p[1]); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="test"> 
 
    <h3 ng-bind="greeting"></h3> 
 
</div>

我缺少什么?

+1

使用$ q。除非您确定需要它,否则您不需要本地承诺。 – estus

+0

并且不要使用角度1.2.23。已经有几年了。目前的版本是1.6.x. –

+0

@estus谢谢!为什么必须是$ q而不是Promise? – Vayne

回答

2

Angular需要知道您的承诺已经解决以触发更改检测周期,重新评估视图中使用的表达式greeting,检测它已更改并更新DOM。

如果您使用角度$ q服务,那是自动的,因为每当$ q promise被解析时,$ q角度服务就会触发更改检测。通过使用原生承诺,您可以在角度背后改变模型的状态。

因此,要么使用$ q,要么理解您正在做的事情,并在回调函数结束时添加$scope.$apply(),以通知角度您已更改模型。

+0

谢谢!我已经多次阅读你的答案。这真的有帮助。在阅读你的答案之前,我还没有认为它是一个功能。 – Vayne

相关问题