我试图让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
被无限调用......任何想法为什么?
答案 0 :(得分:1)
你不能在任何角度表达式中有任何副作用,否则会发生无限循环。
按照设计重复运行所有表达式,直到没有任何改变。所以在解析promise时,表达式将再次被评估。
为避免这种情况,您可以将msg.get
调用移动到控制器中,并将承诺存储为$scope
中的另一个属性:
$scope.msg = {
get: function() {
return MessageHelper.get.apply(this, arguments);
}
};
$scope.resultMsg = $scope.msg.get("existing.message.code", "first param", "second param");
并在模板中使用它:
{{resultMsg}}
希望这有帮助。