簡體   English   中英

試圖使Angular.js顯示承諾時發生無限循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM