2013-07-09 4 views
1

У меня есть следующий завод:Использование завода и контроллера для возврата данных

app.factory('clientFactory', function ($http) { 
    var factory = {}; 

    factory.getClients = function() { 
     var url = "/tracker/api/client"; 
     $http.get(url).then(function (response) { 
      return response.data; 
     }); 
    }; 

    factory.getClient = function (id) { 
     // TODO 
    }; 

    factory.insertClient = function (firstName, lastName, city) { 
     // TODO 
    }; 

    factory.deleteClient = function (id) { 
     // TODO 
    }; 

    return factory; 
}); 

и контроллер:

app.controller('ClientController', function ($scope, clientFactory) { 
    $scope.clients = []; 

    init(); 

    function init() { 
     $scope.clients = clientFactory.getClients(); 
    } 

    $scope.insertCustomer = function() { 
     // TODO 
    }; 

    $scope.deleteCustomer = function (id) { 
     // TODO 
    }; 
}); 

В мой контроллер, «клиенты» всегда нулевой. Я пробовал несколько других подходов, например, что я вижу here, но я получил сообщение об ошибке, что «успех не может быть вызван в null», и если я пропущу эту ошибку, моя функция успеха никогда не вызывается.

Что мне здесь не хватает?

ответ

1

В вашем контроллере вы обрабатываете метод getClients, как если бы он был синхронным. Помните, что когда вы делаете $http.get, обещание возвращается. Вам нужно вернуть это обещание контроллеру, чтобы он мог позвонить .then с помощью метода, который будет обрабатывать успешный результат.

getClients Ваш метод должен выглядеть следующим образом:

factory.getClients = function() { 
    var url = "/tracker/api/client"; 
    return $http.get(url); 
}; 

И я считаю, что ваш метод init должен выглядеть следующим образом:

function init() { 
    clientFactory.getClients().then(function(response) { 
     $scope.clients = response.data; 
    }); 
} 

Попробуйте это!

+0

Отлично! Большое спасибо ... из мира jQuery, все было либо асинхронно, либо нет, и там была какая-то магия (по крайней мере для меня). Обещание вещей для меня нова. – Nicros

+0

Да, обещает немного обернуть голову, но как только вы поймете их, вы полюбите их. Это огромная часть Angular, поэтому вы будете видеть их гораздо чаще! – Polaris878

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