AngularJS: получить объект по идентификатору с завода
У меня есть factory
чтобы получить массив со всеми моими клиентами из базы данных. Тогда мне нужно отфильтровать этот массив по человеку id
и показывать только его данные на одной странице.
У меня уже есть рабочий код, но он только внутри controller
и я хочу использовать его с factory
и directive
так как я больше не использую ng-controller
и это factory
Уже позвоните на другие страницы, где мне нужно показать данные клиента.
Это то, что я пытался сделать с моим factory
:
app.js
app.factory('mainFactory', function($http){
var getCliente = function($scope) {
return $http.get("scripts/php/db.php?action=get_cliente")
.success( function(data) {
return data;
})
.error(function(data) {
});
};
var getDetCliente = function($scope,$routeParams) {
getCliente();
var mycli = data;
var myid = $routeParams.id;
for (var d = 0, len = mycli.length; d < len; d += 1) {
if (mycli[d].id === myid) {
return mycli[d];
}
}
return mycli;
};
return {
getCliente: getCliente,
getDetCliente: getDetCliente
}
});
app.directive('detClienteTable', function (mainFactory) {
return {
restrict: "A",
templateUrl: "content/view/det_cliente_table.html",
link: function($scope) {
mainFactory.getDetCliente().then(function(mycli) {
$scope.pagedCliente = mycli;
})
}
}
});
detClient.html
<p>{{pagedCliente.name}}</p>
<p>{{pagedCliente.tel}}</p>
<p>{{pagedCliente.email}}</p>
[...more code...]
Проблема в том, что я не могу получить какие-либо данные для отображения на странице, а также у меня нет ошибок в моей консоли.
Что может быть не так?
Имейте в виду, я изучаю AngularJS.
2 ответа
По сути, вам нужно реализовать цепочку обещаний, поскольку ваш код выглядит так, как будто вы несете getCliente()
обещать getDetCliente
метод. В этом случае вам нужно использовать .then
функция вместо использования .success
& .error
что не позволяет вам продолжать цепочку обещаний. Там после от getDetCliente
Функция, которую вы снова должны использовать .then
функция, которая получает вызов, когда getCliente
функция решается его обещание. Ваш код переформатирует его используя форму и вернет mycli
результат.
Код
var getCliente = function() {
return $http.get("scripts/php/db.php?action=get_cliente")
.then( function(res) { //success callback
return res.data;
},function(err){ //error callback
console.log(err)
})
};
var getDetCliente = function(id) {
return getCliente().then(function(data){
var mycli = data;
var myid = id;
for (var d = 0, len = mycli.length; d < len; d += 1) {
if (mycli[d].id === myid) {
return mycli[d];
}
}
return mycli;
})
};
редактировать
Вы не должны передавать контроллер $scope
в сервис, который сделает тесную связь с вами директивой и контроллером, также вы хотите перейти id
параметр вашего маршрута, то вам нужно передать его из директивы сервисного вызова
link: function($scope) {
mainFactory.getDetCliente($routeParams.id).then(function(mycli) {
$scope.pagedCliente = mycli;
})
}
Вы лечите getCliente
как синхронный звонок в getDetCliente
, Интересно, что в вашей директиве вы понимаете, что getDetCliente
асинхронный + Изменить getCliente
к этому и рассматривать его как асинхронный вызов, когда вы вызываете его в getDetCliente
:
var getCliente = function($scope) {
return $http.get("scripts/php/db.php?action=get_cliente");
};