Eu estava lendo este artigo: http://eviltrout.com/2013/06/15/ember-vs-angular.html
E dizia:
Devido à falta de convenções, pergunto-me quantos projetos Angular dependem de práticas ruins, como chamadas AJAX diretamente nos controladores? Devido à injeção de dependência, os desenvolvedores estão injetando parâmetros do roteador nas diretivas? Os desenvolvedores iniciantes do AngularJS vão estruturar seu código de maneira que um desenvolvedor experiente do AngularJS acredite ser idiomático?
Na verdade, estou fazendo $http
chamadas do meu controlador Angular.js. Por que é uma má prática? Qual é a melhor prática para fazer $http
chamadas então? e porque?
Respostas:
EDIT: Esta resposta foi focada principalmente na versão 1.0.X. Para evitar confusão, está sendo alterado para refletir a melhor resposta para TODAS as versões atuais do Angular até hoje, 05/12/2013.
A idéia é criar um serviço que retorne uma promessa aos dados retornados, depois chame isso em seu controlador e lide com a promessa para preencher sua propriedade $ scope.
O serviço
O controlador:
Manipule o
then()
método da promessa e obtenha os dados. Defina a propriedade $ scope e faça o que mais for necessário.Resolução Promise In-View (somente 1.0.X):
No Angular 1.0.X, o objetivo da resposta original aqui, as promessas receberão um tratamento especial da View. Quando eles resolverem, seu valor resolvido será vinculado à exibição. Este foi descontinuado no 1.2.X
fonte
$scope.foos
propriedade em um modelo. Se você usar essa mesma propriedade fora de um modelo (por exemplo, em outra função), o objeto armazenado ainda será um objeto de promessa..then()
da promessa e colocar o valor em US $ âmbito ...myService.getFoos().then(function(value) { $scope.foos = value; });
A melhor prática seria abstrair a
$http
chamada em um 'serviço' que fornece dados ao seu controlador:Abstrair a
$http
chamada assim permitirá reutilizar esse código em vários controladores. Isso se torna necessário quando o código que interage com esses dados se torna mais complexo, talvez você deseje processar os dados antes de usá-los em seu controlador e armazenar em cache o resultado desse processo, para que você não precise gastar tempo re-processando-os.Você deve pensar no 'serviço' como uma representação (ou modelo) de dados que seu aplicativo pode usar.
fonte
A resposta aceita estava me dando o
$http is not defined
erro, então tive que fazer o seguinte:A principal diferença é esta linha:
fonte
Eu coloquei uma resposta para alguém que queria um serviço da web totalmente genérico em Angular. Eu recomendo apenas conectá-lo e ele cuidará de todas as suas chamadas de serviço da web sem a necessidade de codificá-las. A resposta está aqui:
https://stackoverflow.com/a/38958644/5349719
fonte