繁体   English   中英

模型未在Promise angularjs的.then方法中更新

[英]model not updating in .then method of promise angularjs

我真的为此感到挣扎,因为它应该非常简单。 我有一条带有定义为login的控制器的路由。 在我的模板中,我具有以下数据绑定{{error}} ,该数据绑定是在自定义服务中执行方法并解析返回的Promise后在控制器中定义的。

控制者

app.controller("login", ['$scope','XMLMC', 'ManageSettings', function ($scope,api,ManageSettings) {
    $scope.error = 'test';
    $scope.login = function() {
        var params = {
            selfServiceInstance: "selfservice",
            customerId: $scope.username,
            password: $scope.password
    };
        var authenticated = api.request("session","selfServiceLogon",params).then(function(response) {
            ManageSettings.set("session",response, $scope);

            if(response.status === "ok") {
                window.location.href = 'portal';
            } else {
                $scope.error = response["ERROR"];
                console.log($scope.error);
            }
        });

    };
}]);

控制台显示“客户未注册”。 显示$ scope.error已适当更新,但视图从未更新。 我的服务在下面,请注意,我在angular的“外部”没有做任何事情,因此我不必手动进行$apply()

app.factory("XMLMC", ['$http', '$q', function ($http, $q) {
    function XMLMC($http, $q) {
        $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

        var that= this;

        this.prepareForPost = function(pkg) {
            return JSON.stringify(pkg);
        };

        this.request = function(service, request, params, host, newsession) {
            var def = $q.defer();
            var P = def.promise;

            if(request === "analystLogon") {
                newsession = true;
            }

            var call = {
                service: service,
                method: request,
                params: params
            };

            if(host) {
                call.host = host;
            } else {
                call.host = "localhost";
            }

            if(newsession) {
                call.newsession = "true";
            }

            var pkg = {
                contents: this.prepareForPost(call)
            };




            $http.post('php/XMLMC/api.php', jQuery.param(pkg)).success(function (response,status) {
                    that.consume(response, def);

                }).error(function (response,status) {
                    def.reject(response,status);
                });

            return P;


        };

        this.consume = function(response, defer) {
            console.log(response);
            var resp = response[0],
                digested = {},
                i;

            digested.status = resp["attrs"]["STATUS"];
            var params = resp["children"][0]["children"];
            for(i=0; i < params.length; i++) {
                var key = params[i]["name"];
                var val = params[i]["tagData"];
                digested[key] = val;
            }

            defer.resolve(digested);
            //return digested;
        };
    }

    return new XMLMC($http, $q);
}]);

我在这里用代码完全按照测试服务器上的代码创建了一个插件。 由于明显的原因,路由等无法正常工作,但是您至少可以看到代码及其协同工作的方式

http://plnkr.co/edit/AodFJfCijsp2VWxWpbR8?p=preview

这是一个进一步简化的小节,其中的所有内容都有一个作用域和一个控制器,没有路由。 由于某种原因,这在插件中有效,但是$ http方法在我的服务器中失败

http://plnkr.co/edit/nU4drGtpwQwFoBYBfuw8?p=preview

编辑

即使这无法更新

var authenticated = api.request("session","selfServiceLogon",params).then(function(response) {
            ManageSettings.set("session",response, $scope);

    $scope.error = "foo!";

            if(response.status === "ok") {
                window.location.href = 'portal';
            } 
        });

看来确实需要$ scope。$ apply。 参见AngularJS-为什么需要应用$来正确解决$ q承诺?

引用 @ pkozlowski.opensource:

在AngularJS中,承诺解析的结果在$ digest周期内异步传播。 因此,仅在进入$ digest循环后才调用在then()中注册的回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM