Контроллер/фабрика AngularJS возвращает неопределенный объект

Результат контроллера Angular не определен после вызова веб-API с заводским отдыхом. Я видел много сообщений об этом, но ни один из них не решил мою проблему. У меня есть контроллер, который делает спокойный вызов веб-api2. Используя fiddler, я вижу сделанный вызов и ответ 200, но я никогда не могу получить результаты, и я знаю, что получение осуществляется через асинхронность. Ниже находится завод и контроллер. Я также пытался явно отправить обратный вызов в фабрику, этот подход не приводит даже к результату неопределенного объекта, просто не работает. Я действительно здесь в тупике, и я новичок в Angularjs, что не так? В настоящее время у меня есть вызов контроллера, подключенный к кнопке для явного тестирования.

**FACTORY NO EXPLICIT CALL-BACK** 
casenoteApp.factory('MyFactory', function ($http) {


var factory = {};

var urlBase = 'http://xxxxxx/api/Client';


factory.getClients = function (userLogin) {

    return $http.get(urlBase + '/' + userLogin);
};


return factory;
});

**CONTROLLER NO EXPLICIT CALL-BACK** 
casenoteApp.controller('MyController', MyController);

function MyController($scope, MyFactory) {


$scope.addCustomer = function () {

    MyFactory.getClients(123456)
       .success(function (clients) {

            var curCust = clients;
            $scope.status = clients.last_name;

        })
       .error(function (error) {
           $scope.status = 'Unable to load client data: ' + error.message;
       });        

}


}

**FACTORY PASSING IN CALL-BACK**
casenoteApp.factory('MyFactory', function ($http) {


var factory = {};

var urlBase = 'http://xxxxxx/api/Client';

factory.getClients = function (userLogin, callback) {

    return $http.get(urlBase + '/' + userLogin).success(callback)

}

return factory;
});


**CONTROLLER PASSING IN CALL-BACK**
casenoteApp.controller('MyController', MyController);

function MyController($scope, MyFactory) {


$scope.addCustomer = function () 



    MyFactory.getClients(123456, function(clients) {

            var curCust = clients[0];
            $scope.status = clients.last_name;
        })


}

}

person Aaron Lind    schedule 07.08.2014    source источник


Ответы (1)


Настройте свою фабрику на использование .then и возвратите данные, например:

casenoteApp.factory('MyFactory', function ($http) {
    var urlBase = 'http://xxxxxx/api/Client';

    return {
        getClients: function (userLogin) {
            return $http.get(urlBase + '/' + userLogin).then(function(data) {
                return data.result;
            });
        }
    };
});

И ваш контроллер:

MyFactory.getClients(01234).then(function(data) {
    console.log(data); //hello data!
});
person tymeJV    schedule 07.08.2014
comment
Это приводит к той же проблеме. Возвращенный JSON выглядит нормально: {int_id:123456,last_name:Doe,first_name:John,type:FAM,sex:null,birthdate:null в fiddler, но в консоли я получаю следующее: XMLHttpRequest для xxxxxx/api/Client/192524 требуется совместное использование ресурсов между источниками (CORS). Веб-сервис находится на том же сервере, но в другом виртуальном каталоге. Это не должно требовать jsonp, правильно? И если да, похоже ли это на проблему? Почему может возникнуть эта ошибка? - person Aaron Lind; 08.08.2014
comment
Ладно, пришлось расчистить паутину. Когда я начал это, проект угловой визуальной студии работал на встроенном сервере, а веб-службы размещались, поэтому это вызвало проблему перекрестного происхождения. Теперь я повторно разместился в IIS, и я получаю обратный вызов на свой контроллер, но возвращаемые данные все еще не определены при отправке в console.log. - person Aaron Lind; 08.08.2014
comment
Хорошо, теперь это работает. Это должно быть .data, поэтому для вышеуказанного data.data теперь возвращает результаты. Спасибо. - person Aaron Lind; 08.08.2014