[英]Infinite loop when trying to make Angularjs display a promise
如本文所述,當我試圖使AngularJS顯示一個承諾時,我正面臨一個無限循環: http : //markdalgleish.com/2013/06/using-promises-in-angularjs-views/ 。
我首先調用$parseProvider.unwrapPromises(true);
:
.config(["$parseProvider",
function($parseProvider) {
$parseProvider.unwrapPromises(true);
}])
這是我用來訪問消息的工廠:
app.factory("MessageHelper", [
function() {
// omitted for brevity:
// calling the server for getting the messages
return {
get: function(code) {
var args = Array.prototype.slice.call(arguments);
args.shift();
if (messages) {
return $q.when(format(messages[code], args));
}
var deferred = $q.defer();
deferredMessages.push({ code: code, args: args, deferred: deferred });
return deferred.promise;
}
};
}]);
然后,在控制器中:
$scope.msg = {
get: function() {
return MessageHelper.get.apply(this, arguments);
}
};
最后,在一個視圖中:
<span>{{msg.get("existing.message.code", "first param", "second param")}}</span>
這是無限循環: $scope.msg.get
被無限調用...知道為什么嗎?
在任何角度表達式中,都不能有任何副作用,否則會發生無限循環。
根據設計,它會重復重新運行所有表達式,直到沒有任何更改為止。 因此,在兌現承諾時,表達式將再次被求值。
為了避免這種情況,您可以將msg.get
調用移至控制器中,並將promise作為另一個屬性存儲在$scope
:
$scope.msg = {
get: function() {
return MessageHelper.get.apply(this, arguments);
}
};
$scope.resultMsg = $scope.msg.get("existing.message.code", "first param", "second param");
並在模板中使用它:
{{resultMsg}}
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.