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");
};
Другие вопросы по тегам