我有一個控制器,我需要使用Ajax加載內容。當它正在加載時,我希望在此期間出現一個微調器。該代碼看起來像下面:
<i class="fa fa-2x fa-spin fa-spinner" ng-show="isLoadingContent"></i>
以及相應的JS:
$scope.isLoadingContent = true;
$q.all(promises).then(function (values) {
$scope.isLoadingContent = false;
// more code - display returned data
然而,UI微調不會出現在那裏/我期望它,當我通過代碼出現。
$scope.isLoadingContent = true;
debugger; // the spinner does not appear on the UI
$q.all(promises).then(function (values) {
debugger; // the spinner finally does appear in the UI at this point
$scope.isLoadingContent = false;
// more code - display returned data
我曾嘗試逐步執行代碼,但短了,以什麼回事 - ,我相信我誤解的事件在事件循環和其中角循環播放,它的發生順序在這一切中的作用。
有人能夠提供一個解釋,說明爲什麼微調器設置爲出現在承諾的方法中,而不是我設置的地方$scope.isLoadingContent
?它實際上沒有設置,而是在事件循環的消息隊列中排隊?
------------ ------------編輯
我相信我碰到一個解釋來爲這是怎麼回事。非常感謝@jcford和@istrupin。
因此,在原始文章中缺少一點消息,觸發承諾調用和微調更新的事件實際上基於一個$scope.$on("some-name", function(){...})
事件 - 實際上是在當前控制器範圍之外觸發的單擊事件。我相信這意味着美元消化週期不起作用,因爲它通常會發生,因爲事件起源發生在何處。因此,$on
函數中的任何更新都不會像通常那樣調用$ apply/$ digest,這意味着我必須專門進行該$摘要調用。
奇怪的是,現在我意識到在$q.all()
之內,它必須調用$apply
,因爲在調試時,我看到了我期望的DOM更改。 FWIW。
tl; dr - 請撥打$digest
。
請提供[MCVE] –
你能一次嘗試使用NG-如果不是NG-表演。 – Ved
你能展示如何創建承諾嗎? –