Возникли проблемы с AngularJS Factory при возврате данных контроллеру
У меня возникли некоторые проблемы с отправкой данных, полученных из моего API с Angular на мой контроллер... В коде вы можете увидеть комментарии к проблеме... Я делаю $ http.get () запрашивает, и я получаю свою информацию, но затем, в возврате, данные исчезают :S
angular.module('OurenApp.services', ['ngCookies'])
.factory('Customers', function (CONFIG, $cookies, $http) {
// Get Customers from API
var customers = [];
var req = {
method: 'GET',
url: CONFIG.APIURL + '/customers/' + $cookies.get('user_id') + '/' + $cookies.get('API_KEY'),
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
};
$http(req).then(function successCallback(response) {
// Set message and send data to the view
//console.log(response.data.customers);
customers = response.data.customers; // <- Here I have an array of Objects (each object is a customer)
}, function errorCallback(err) {
// Set error message
console.log(err);
})
return {
all: function () {
console.log(customers); // <- Here I have an empty object ¿?¿?¿?
return customers;
},
remove: function (customer) {
customers.splice(customers.indexOf(customer), 1);
},
get: function (customerId) {
for (var i = 0; i < customers.length; i++) {
if (customers[i].id === parseInt(customerId)) {
return customers[i];
}
}
return null;
}
};
});
Вот что я получаю:
customers: Array[21]
0: Object
1: Object
2: Object
3: Object
edited: "2015-11-26T22:57:25+0100"
id: 88
location: "Servicio Técnico Oficial"
name: "Makumba"
pass: "olakase"
phone: "600999222"
seen: 1
status: "En Curso"
__proto__: Object
4: Object
5: Object
6: Object
7: Object
8: Object
9: Object
10: Object
11: Object
12: Object
13: Object
14: Object
15: Object
16: Object
17: Object
18: Object
19: Object
20: Object
length: 21
__proto__: Array[0]
Ионный шаблон поддельной информации имеет такую структуру:
// Some fake testing data
var chats = [{
id: 0,
name: 'Ben Sparrow',
lastText: 'You on your way?',
face: 'img/ben.png'
}, {
id: 1,
name: 'Max Lynx',
lastText: 'Hey, it's me',
face: 'img/max.png'
}, {
id: 2,
name: 'Adam Bradleyson',
lastText: 'I should buy a boat',
face: 'img/adam.jpg'
}, {
id: 3,
name: 'Perry Governor',
lastText: 'Look at my mukluks!',
face: 'img/perry.png'
}, {
id: 4,
name: 'Mike Harrington',
lastText: 'This is wicked good ice cream.',
face: 'img/mike.png'
}];
Поэтому я предполагаю, что мне нужно преобразовать мой массив объектов в это... Кто-нибудь может мне помочь!! Спасибо :)
Отредактировано!
И еще один вопрос... Как я могу сделать, чтобы обновить данные. Я читал, что фабрики получают данные только один раз. Но когда я добавляю нового клиента, мне нужно перезагрузить новые данные или иметь кнопку для перезагрузки страницы.... Я пытался с $state, но не работает.
Спасибо!
1 ответ:
Это не тот способ, которым вы должны обращаться с асинхронным вызовом. Вы должны подождать, пока это не закончится, а затем вернуть данные с контроллера.
В этом случае это может быть достигнуто с помощью
$q
. В основном$http.get
возвращает обещание. И на resolve он выполняет.then
1-ю функцию как успешный обратный вызов и 2-ю как обратный вызов ошибки.Используя
$q
, вы хотели подождать, пока обещание не будет выполнено. Вы можете использовать$q.when(promise)
, который снова будет иметь функцию.then
,.then
функция получает вызывается, когда объектpromise
получает разрешение иreturn
некоторые данные. Этот механизм называется так: цепное обещание.Фабрика
.factory('Customers', function (CONFIG, $cookies, $http, $q) { // Get Customers from API var customers = []; var req = { method: 'GET', url: CONFIG.APIURL + '/customers/' + $cookies.get('user_id') + '/' + $cookies.get('API_KEY'), headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } }; //created promise object var promise = $http(req).then(function successCallback(response) { // Set message and send data to the view //console.log(response.data.customers); customers = response.data.customers; // <- Here I have an array of Objects (each object is a customer) return customers; }, function errorCallback(err) { // Set error message console.log(err); return err; }) return { all: function () { console.log(customers); // <- Here I have an empty object ¿?¿?¿? //returned promise will wait till promise gets complete. return $q.when(promise).then(function(){ return customers; //returning data to continue promise chain }); }, remove: function (customer) { customers.splice(customers.indexOf(customer), 1); }, get: function (customerId) { for (var i = 0; i < customers.length; i++) { if (customers[i].id === parseInt(customerId)) { return customers[i]; } } return null; } }; });
Контроллер
//.then function will get call when ajax gets completed. Customers.all().then(function(customers){ console.log(customers) })