Benarkah $ resource memiliki batasan untuk tidak menggunakan futures yang tepat mengingat masalah ini (https://github.com/angular/angular.js/issues/415) telah ditutup? (Saya baru mengenal Angular, permintaan maaf saya jika pertanyaannya membingungkan.) EDIT - Komit ini ( github.com/angular/angular.js/commit/… ) juga tampaknya menyarankan bahwa $ resource mungkin tidak memiliki batasan itu lagi?
Jason Sydes
1
baik itu legal di sini untuk menjawab pertanyaan Anda sendiri .. ok? tekan "Ajukan Pertanyaan", itu disebut "berbagi pengetahuan Anda"
holms
Jawaban:
229
Ada beberapa kasus ketika $ resource mungkin tidak sesuai ketika berbicara dengan backend. Ini menunjukkan cara mengatur perilaku seperti sumber daya $ tanpa menggunakan sumber daya.
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;});
Kemudian di dalam controller Anda, Anda dapat:
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;});};
Mungkin pertanyaan noob, tetapi bagaimana orang akan memperluas ini untuk mendapatkan get () yang mengembalikan beberapa respons bukan hanya satu respons?
Nate Bunney
2
@NathanBunney, Anda bisa meminta metode get statis Anda di atas melalui hasil dan membangun array Buku.
Ben Lesh
4
@NathanBunney 'Book.getAll = function () {return $ http.get (' / Book '). Lalu (function (response) {var books = []; for (var i = 0; i <response.data.length ; i ++) {books.push (Buku baru (response.data [i]));} mengembalikan buku;}); }; '
Yair Nevet
2
Bagaimana Anda berbagi bookatau koleksi bookantara pengendali?
Lukas
1
Ini bagus (jelas sejak Misko menciptakan kerangka kerja), tapi saya berjuang untuk mencari cara membuatnya bisa digunakan kembali. Jika saya ingin mengimplementasikan fungsi CRUD hanya sekali dan kemudian mewarisi fungsi mereka di pabrik anak / layanan yang hanya membutuhkan argumen urlBase (lebih disukai disimpan pada prototipe sehingga setiap instance tidak memerlukan salinan baru dari urlBase), bagaimana Saya melakukannya?
Ini mungkin mendukung (url override) dalam versi Angularjs berikutnya. Maka Anda akan dapat kode seperti ini:
// need to register as a serviceName
$resource('/user/:userId',{userId:'@id'},{'customActionName':{
url:'/user/someURI'
method:'GET',params:{
param1:'....',
param2:'....',}},....});
Dan mengembalikan callback dapat ditangani dalam lingkup ctrl seperti ini.
Jawaban:
Ada beberapa kasus ketika $ resource mungkin tidak sesuai ketika berbicara dengan backend. Ini menunjukkan cara mengatur perilaku seperti sumber daya $ tanpa menggunakan sumber daya.
Kemudian di dalam controller Anda, Anda dapat:
sumber
book
atau koleksibook
antara pengendali?Saya sarankan Anda menggunakan $ resource .
Ini mungkin mendukung (url override) dalam versi Angularjs berikutnya. Maka Anda akan dapat kode seperti ini:
Dan mengembalikan callback dapat ditangani dalam lingkup ctrl seperti ini.
Mungkin Anda dapat menangani kode pada level abstraksi yang lebih tinggi.
sumber