Ainda é verdade que $ resource tem a limitação de não usar futuros adequados, uma vez que esse problema (https://github.com/angular/angular.js/issues/415) foi encerrado? (Sou novo no Angular, peço desculpas se a pergunta for confusa.) EDIT - Esse commit ( github.com/angular/angular.js/commit/… ) também parece sugerir que $ resource pode não ter mais essa limitação?
Jason Sydes
1
bem, é legal aqui para responder suas próprias perguntas .. ok? imprensa "Pergunte", que é chamado de "compartilhar o seu conhecimento"
holms
Respostas:
229
Há casos em que $ resource pode não ser apropriado ao conversar com o back-end. Isso mostra como configurar um comportamento semelhante a $ resource sem usar o recurso.
angular.module('myApp').factory('Book',function($http){// Book is a class which we can use for retrieving and // updating data on the servervarBook=function(data){
angular.extend(this, data);}// a static method to retrieve Book by IDBook.get=function(id){return $http.get('/Book/'+ id).then(function(response){returnnewBook(response.data);});};// an instance method to create a new BookBook.prototype.create =function(){var book =this;return $http.post('/Book/', book).then(function(response){
book.id = response.data.id;return book;});}returnBook;});
Em seguida, dentro do seu controlador, você pode:
varAppController=function(Book){// to create a Bookvar book =newBook();
book.name ='AngularJS in nutshell';
book.create();// to retrieve a bookvar bookPromise =Book.get(123);
bookPromise.then(function(b){
book = b;});};
Talvez uma pergunta noob, mas como estender isso para permitir um get () que retornou várias respostas, não apenas uma única resposta?
Nate Bunney
2
@ NathanBunney, você pode fazer com que seu método estático acima faça um loop através dos resultados e crie uma matriz de livros.
precisa
4
@NathanBunney 'Book.getAll = function () {return $ http.get (' / Book '). Then (function (response) {var books = []; for (var i = 0; i <response.data.length ; i ++) {books.push (novo livro (response.data [i]));} retornar livros;}); }; '
Yair Nevet
2
Como você compartilharia uma bookou coleção de books entre controladores?
Lukas
1
Isso é ótimo (obviamente desde que Misko criou a estrutura), mas estou lutando para descobrir como torná-la reutilizável. Se eu quisesse implementar as funções CRUD apenas uma vez e depois herdar sua funcionalidade em fábricas / serviços filhos que precisavam apenas de um argumento urlBase (de preferência armazenado no protótipo para que cada instância não precisasse de uma nova cópia do urlBase), como seria Eu faço isso?
Pode suportar (substituição de URL) na próxima versão do Angularjs. Então você poderá codificar assim:
// need to register as a serviceName
$resource('/user/:userId',{userId:'@id'},{'customActionName':{
url:'/user/someURI'
method:'GET',params:{
param1:'....',
param2:'....',}},....});
E retornos de chamada de retorno podem ser manipulados no escopo ctrl como este.
Respostas:
Há casos em que $ resource pode não ser apropriado ao conversar com o back-end. Isso mostra como configurar um comportamento semelhante a $ resource sem usar o recurso.
Em seguida, dentro do seu controlador, você pode:
fonte
book
ou coleção debook
s entre controladores?Eu recomendo que você use $ resource .
Pode suportar (substituição de URL) na próxima versão do Angularjs. Então você poderá codificar assim:
E retornos de chamada de retorno podem ser manipulados no escopo ctrl como este.
Provavelmente, você pode manipular código em um nível de abstração mais alto.
fonte