Я пытаюсь использовать базовый шаблон вкладок в ионной форме. Просто хотел использовать $ http внутри службы и собирать данные из конечной точки API. Он работает, когда в контроллере используется $ http, но он не находится внутри службы. Это основной шаблон вкладок в ионной структуре. Я пытаюсь создать что-то поверх этого, просто изменив источник данных на конечную точку api.
//Service body starts
.service('Datas', function($http) {
$http.get('https://www.googleapis.com/api_url').then(function(response){
var datas = response.data.items;
return {
all: function() {
return datas;
},
get: function(dataId) {
for (var i = 0; i < data.length; i++) {
if (datas[i].id === parseInt(dataId)) {
return data[i];
}
}
return null;
}
};
});
//Service body ends
//controller starts here
.controller('Cntrl', function($scope, Datas) {
$scope.data = Datas.all();
})
//controller ends here
//template starts
<div ng-repeat="data in datas">
{{data.title}}
</div>
//template ends
Объявление переменной datas
должно быть в структуре сервиса. Не заключен в функцию обработчика успеха.
app.service('Datas', function($http) {
//Declare datas here
var datas = [];
$http.get(url).then(function(response){
//NOT here
//var datas = response.data.items;
//Also use angular.copy
angular.copy(response.data.items, datas);
});
return {
all: function() {
return datas;
},
get: function(dataId) {
for (var i = 0; i < datas.length; i++) {
if (datas[i].id === parseInt(dataId)) {
return datas[i];
};
};
return null;
}
};
});
Кроме того, поскольку контроллер извлекает datas
объекта ссылки до завершения XHR, использовать angular.copy
. Избегайте использования оператора присваивания, который заменил бы исходную ссылку на объект новой ссылкой на объект.
$promise
Это может быть мудрым, чтобы прикрепить httpPromise как свойство к datas
объекта.
app.service('Datas', function($http) {
//Declare datas here
var datas = [];
datas.$promise = $http.get(url).then(function(response){
//NOT here
//var datas = response.data.items;
//Also use angular.copy
angular.copy(response.data.items, datas);
//return data for chaining
return datas;
});
Свойство $promise
может пригодиться при попытке избежать условий гонки, таких как контроллер, использующий Datas.get
до завершения Datas.get
.
У вас есть синтаксические ошибки, возвращаемый объект должен находиться в области обслуживания.
.service('Datas', function($http) {
var datas = null;
$http.get('https://www.googleapis.com/api_url')
.then(function(response) {
datas = response.data.items;
});
return {
all: function() {
return datas;
},
get: function(dataId) {
for (var i = 0; i < data.length; i++) {
if (datas[i].id === parseInt(dataId)) {
return data[i];
}
}
return null;
}
};
});