2017-06-04 58 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

相關問題