2017-10-04 65 views
1

我在控制器內部有一些操作。它包含一個Promise對象,在解析時應該通過controllerAs綁定來更新視圖。問題是已解決的值是正確的(記錄在控制檯中),但將其分配給控制器不會更新視圖。它只會在包含該承諾的操作再次執行時更新。所以,如果我通過按下一個按鈕來繼續執行它,則更新會延遲一次執行。AngularJS在解決承諾時延遲了視圖更新

我正在使用AngularJS 1.6.5。我沒有使用$ q。沒有$範圍,所以沒有$請適用。

我與2名成員簡化控制器的行爲比較具有和沒有承諾:

var vm = this; 

vm.textSync = 0; 
vm.textAsync = 0; 

vm.onclick = function() 
{ 
    var action = new Promise(function(resolve, reject) 
    { 
     resolve(vm.textAsync + 1); 
    }); 

    action.then(function(result) 
    { 
     console.log(result); 
     vm.textAsync = result; 
    }); 

    vm.textSync++; 
}; 

記錄的值等於遞增textSync(1,2,3,...),但textAsync在視圖中等於(textSync-1)在eack點擊之後(因此它是0,1,2,...)。爲什麼是這樣以及如何解決它?

我的簡化圖:

<input type="button" value="Click me" ng-click="$ctrl.onclick()" /> 
<input ng-model="$ctrl.textSync" /> 
<input ng-model="$ctrl.textAsync" /> 

回答

0

既然你不想觸發消化週期,你可以使用$暫停時以0秒等待消化週期,因此包裝你的諾言這樣的,只是功能後省略0 - 不需要:

$timeout(action.then(function(result) { 
     console.log(result); 
     vm.textAsync = result; 
    }));