【问题标题】:AngularJS 1.7 - HTTP POSTAngularJS 1.7 - HTTP POST
【发布时间】:2019-07-03 22:25:58
【问题描述】:

升级到angularjs 1.7版,这段代码无法编译

app.factory('LoginService', function ($http) {
        return {
            login: function (param, callback) {
                $http.post(url, param)
                   .success(callback)
                   .error(function (data, status, headers, config) {
                   });
            }
        };
    });

在控制器上我调用服务 LoginService

    function LoginController($http, $location, LoginService, blockUI) {
    var vm = this;
    LoginService.usuario(
          {login: vm.username, clave: vm.password},
      function (data, status, headers, config) {                
              vm.resultado = data;
              if (vm.resultado == "True") {
                  window.location = "/Home/Index";
              } else {
                  vm.error = 'Usuario o password incorrecto';
              }
          });
};

我想知道该函数是如何从控制器调用的,因为它使用 .then 实现了 http.post 服务

app.factory('LoginService', function ($http) {
        return {
            login: function (data) {
                $http.post(url, data)
                    .then(function (resultado) {
                        debugger;
                        if (resultado.data === "True") {
                            return resultado.data;}
                        else {
                              console.log("NO");}
                         });
                       }};
                      });

【问题讨论】:

  • 您提供的代码有一些不一致的地方。 LoginService 的重构.then 版本公开了一个名为“login”的函数,但是您的控制器正在调用LoginService.usario?

标签: angularjs post xmlhttprequest


【解决方案1】:

我建议你熟悉 AngularJS $q service 及其 Promise API。

LoginService.login(...) 方法应该从 $http.post(...) 返回 Promise:

app.factory('LoginService', function ($http) {
    return {
        login: function (data) {
            return $http.post(url, data)
                .then(function(response) {
                    return response.data;  
                });
        });

然后,您的 Controller 可以通过已解析的 Promise 访问返回的数据:

function LoginController(LoginService) {
var vm = this;
LoginService.login({login: vm.username, clave: vm.password})
    .then(function (result) {
        // handle result here...
      });

【讨论】:

  • 感谢您的回答,但我在控制器的“then”行中收到错误,“无法读取未定义的登录控制器的属性”,我会按照您的建议寻找承诺跨度>
  • 我猜你错过了 LoginService 中的return。该错误告诉您,您正在调用.then()事物undefined - 这是LoginService.login() 的返回值。确保您拥有:return $http.post(...).
【解决方案2】:

解决办法是这样的:

function LoginController($scope,$window,$q,LoginService) {

$scope.fnBusqueda = function () {
    var promesas = [
      obtenerLogin()
    ];

    $q.all(promesas).then(function (promesasRes) {
        var oArrayResponse = promesasRes;
        if ((oArrayResponse.length > 0)) {
            $scope.respuesta = oArrayResponse[0];
            if ($scope.respuesta == "True") {
                window.location = "/Home/Index";
            } else {
                $cope.error = 'Usuario o password incorrecto';
            }
        }
    });


};

function obtenerLogin() {
    var defered = $q.defer();
    var promise = defered.promise;
    LoginService.login(url_valida_login, '{login:X,clave:X}').then(function (response) {
        defered.resolve(response);
    }).catch(function (data) {
        defered.resolve([]);
    })
    return promise;
}

}

【讨论】:

    猜你喜欢
    • 2016-02-06
    • 2017-08-24
    • 1970-01-01
    • 2016-12-08
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多