AngularJS 1.7 — HTTP POST

Обновите до версии 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';
              }
          });
};

Я хочу знать, как функция вызывается из контроллера, потому что она реализовала службу http.post с использованием .then

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.info("NO");}
                         });
                       }};
                      });

В коде, который вы предоставили, есть некоторые несоответствия. Рефакторинговая версия LoginService для .then предоставляет функцию с именем «логин», однако ваш контроллер вызывает LoginService.usario?

MS_AU 11.02.2019 13:36
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
0
1
302
2

Ответы 2

Я предлагаю вам ознакомиться с AngularJS $q сервис и его Promise API.

Ваш метод LoginService.login(...) должен возвращать Promise от $http.post(...):

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

Затем ваш контроллер может получить доступ к возвращенным данным через разрешенное обещание:

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

Спасибо за ответ, но я получаю сообщение об ошибке в строке «тогда» контроллера «Невозможно прочитать свойство затем неопределенного al loginController», я буду искать промисы, как вы мне рекомендовали.

Marvin Diaz Montenegro 11.02.2019 14:50

Я предполагаю, что вы пропустили return в своем LoginService. Эта ошибка говорит вам, что вещь, с которым вы вызываете .then(), — это undefined, что является возвращаемым значением LoginService.login(). Убедитесь, что у вас есть: return $http.post(...).

MS_AU 12.02.2019 05:20

решение будет таким:

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;
}

}

Другие вопросы по теме