2016-06-16 20 views
0

Попытка получить данные с фабрики и передать ее в контроллер, чтобы затем использовать ее в ng-повторе. Не уверен, почему, но контроллер никогда не запускает функцию, установленную на заводе.Невозможно получить данные о угловых фабриках в контроллере

Контроллер

angular.module('myApp').controller('AppController',['$scope','ItemsFactory', 
    function($scope,ItemsFactory){ 
    ItemsFactory.getItems(function(err, data){ 
     $scope.items = data; 
     console.log('controller items', $scope.items); 
    }); 
}]); 

завод

angular.module('myApp').factory('ItemsFactory', function($http){ 
    var getItems = function(){ 
     $http({ 
     method: 'GET', 
     url: 'js/data/data.min.json' 
     }).then(function success(response, data){ 
     var results = response.data; 
     console.log('factory results', results); 
     }, function error(response){ 
     console.log('error getting items'); 
     }); 
    }; 
    return{ 
     getItems: getItems 
    }; 
}); 

Вслед за несколько других примеров отвечал, но ничего не похоже на работу либо

Результаты возвращаются на заводе, просто не в состоянии передать, что через к контроллеру

Редактировать

Искренне благодарю вас всех за ваши ответы, как они были все чрезвычайно полезно, проработано и пролило много света на обещания и обратные вызовы.

Решил использовать @Fernando Fabreti ответ, поскольку он был как можно ближе к тому, что я искал.

завод

angular.module('myApp').factory('ItemsFactory', function($http){ 
    var getItems = function(callback){ 
     $http({ 
     method: 'GET', 
     url: 'js/data/data.min.json' 
     }).then(function success(response, data){ 
     var results = response.data; 
     if(callback) callback(null, results); 
     }, function error(response){ 
     console.log('error getting items'); 
     }); 
    }; 
    return{ 
     getItems: getItems 
    }; 
}); 

Контроллер

angular.module('myApp').controller('AppController',['$scope','ItemsFactory', 
    function($scope, ItemsFactory){ 

    ItemsFactory.getItems(function(err, data){ 
     $scope.items = data; 
     console.log('controller items', $scope.items); 
    }); 
}]); 

ответ

1

Вы должны определить обратный вызов параметры и "вызов" обратный вызов, как только вы получите результаты:

angular.module('myApp').factory('ItemsFactory', function($http){ 
    var getItems = function(cback){ 
     $http({ 
     method: 'GET', 
     url: 'js/data/data.min.json' 
     }).then(function success(response, data){ 
     var results = response.data; 
     console.log('factory results', results); 
     if (cback) cback(null, results); 
     }, function error(response){ 
     console.log('error getting items'); 
     if (cback) cback(response, null); 
     }); 
    }; 
    return{ 
     getItems: getItems 
    }; 
}); 
+0

Спасибо за ответ, путаясь на возвраты и посылов. –

+0

Much cleaner, используя обещание '$ http' – charlietfl

1

Вы смешиваете обратный вызов и обещать стили вызова метода здесь. Кажется, вы хотите передать обратный вызов в getItems (getItems не принимает никаких параметров) и использовать результат на основе обещаний на заводе (хотя вы не обещаете никаких обещаний).

Решите, что вы хотите сделать. Если вы хотите использовать форму обещание сделать что-то вроде этого (для простоты):

var getItems = function(){ 
     return $http({ 
     method: 'GET', 
     url: 'js/data/data.min.json' 
     }) 
    }; 

И в контроллере сделать что-то с тогдашним или ошибки функции.

ItemsFactory.getItems().then(function(response) { 
    $scope.items = response.data; 
}) 
.catch(function(response) { 
    console.error('error', response.status, response.data); 
}) 
+0

Я вижу, что вы говорите –

+0

, и можете сократить его до ...' return $ http.get ('js/data/data.min.json'); ' – charlietfl

1

Если вы хотите использовать функцию обратного вызова вы должны вернуть $http обещание. Попробуй это.

Фабрика:

angular.module('myApp').factory('ItemsFactory', function($http){ 
    var getItems = function(){ 
     var http = $http({ 
     method: 'GET', 
     url: 'js/data/data.min.json' 
     }).then(function success(response){ 
     return response.data; 
     }, function error(response){ 
     console.log('error getting items'); 
     }); 
     return http; 
    }; 
    return{ 
     getItems: getItems 
    }; 
}); 

Контроллер:

angular.module('myApp').controller('AppController',['$scope','ItemsFactory', 
    function($scope,ItemsFactory){ 
    ItemsFactory.getItems().then(function (data) { 
     $scope.items = data; 
    }); 
}]); 
+0

Спасибо для ответа, сочетая то, что имеет смысл как у вас, так и у @ Роберта Москаля. Я тоже пробовал и работал правильно, помогая мне понять весь обратный вызов и обещания. –

Смежные вопросы