2016-03-07 63 views
0

在我的角度應用程序中,我有一個隔離範圍指令。該指令在其作用域中獲取一個字符串參數,並且由於此值可能由異步過程中的父作用域初始化 - 它也會得到一個承諾,當該值準備好使用時,該承諾將由父代解決。解決承諾時角度摘要未運行

奇怪的是:當promise被解析時,指令作用域中的值仍然未定義,儘管在父控制器中它有一個值。

請參閱本plunker爲我所經歷的例子: https://plnkr.co/edit/WLILKaO95xWwU2RF29oX?p=preview

在控制器:

$scope.defer = $q.defer(); 

    // to simulate an async operation 
    $timeout(function(){ 
    $scope.ctrlValue = 'Hi'; 
    $scope.defer.resolve(); 
    }); 

在指令:

scope.valuePromise.then(function(){  
    alert(scope.value); 
}); 

重要提示:如果我換行'$ alert'代碼行在$ timeout超時 - scope.value具有正確的值。當承諾解決時,角度似乎沒有運行摘要。

任何想法?

+0

使用'$適用()'爲您超時功能 –

+0

你必須要麼使用$適用()或$消化()啓動角消化週期..沒有它的角將無法知道何時解決承諾。 – Dreamweaver

+0

我知道$ apply會運行一個摘要,但我想避免這種形式的一些原因 - 尤其是因爲當有另一個摘要正在進行時它會拋出錯誤。它是否真的如此 - 承諾解決後沒有摘要? – user2717436

回答

1

在指令中使用$timeout。需要一段時間才能將父級作用域的更改應用到指令作用域。您嘗試在未更新時獲取該值。

var app = angular.module('app', []); 
 

 
app.controller('ctrl', function($scope, $q, $timeout) { 
 
    $scope.defer = $q.defer(); 
 
    
 
    $timeout(function() { 
 
    $scope.ctrlValue = 'Hi'; 
 
    $scope.defer.resolve(); 
 
    }); 
 
}); 
 

 
app.directive('dir', function($timeout){ 
 
    return { 
 
    restrict: 'E', 
 
    scope: { 
 
     value: '=', 
 
     valuePromise: '='  
 
    }, 
 
    link: function(scope) { 
 
     scope.valuePromise.then(function() { 
 
     $timeout(function() { 
 
      alert(scope.value);   
 
     }); 
 
     }); 
 
    } 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app"> 
 
    
 
    <div ng-controller="ctrl"> 
 
    
 
     <h1>Hello Plunker!</h1> 
 
     <dir value="ctrlValue" value-promise="defer.promise"></dir> 
 
    </div> 
 
    </div>

+0

超時不是獲取數據的正確選項。它可能需要不同的時間跨度基於用戶的查詢性能可能會執行緩慢 –

+0

@JinnaBalu這是主題啓動器用來模擬來自遠程資源的響應。 –

+0

這個例子與我的不相似 - 這裏的值用在一個表達式中,這個表達式在每個摘要循環中都被評估過,這就是它被更新的原因。在我的情況下,我需要它解決後立即更新。 – user2717436