2012-11-13 5 views
26

Ben OLMAYAN RESTful şekilde koleksiyonumu almak istiyorum, bu yüzden Collection.fetch Ben yanıta benim toplama nasıl ayarlanacağını bilmiyorumgeçersiz kılma omurgası en Koleksiyonu getirme

App.carClc = Backbone.Collection.extend({ 
    model : App.cardModel, 
    url : 'http://localhost/bbtest/data.php', 
    fetch : function() { 
     $.ajax({ 
      type : 'GET', 
      url : this.url, 
      success : function(data) { 
       console.log(data); 
      } 
     }); 
    } 
}); 

ile geçersiz kılmak için karar verirler. BackboneJS için yeniyim, hepinize teşekkürler!

+0

Bunu anlamıyorum. Neden bir $ .ajax yazmak? Getirmek kodunuz olmadan aynı şekilde!!? .. – Moszeed

+6

Sunucu tarafı tarzı RESTful değil –

cevap

56

, ama tamamen geçersiz kılamaz deneyin:

İşte
var MyCollection = Backbone.Collection.extend({ 

     //custom methods 

     fetch: function(options) { 

      //do specific pre-processing 

      //Call Backbone's fetch 
      return Backbone.Collection.prototype.fetch.call(this, options); 
     } 

    });  

, dışarı rulo gerekmez senin sen omurga en fetch yöntemi tarafından döndürülen jQuery sözünü kullanmak istiyorsanız $.ajax

Ayrıca son satırında return unutma kendi.

Daha fazla ayrıntı için http://japhr.blogspot.in/2011/10/overriding-url-and-fetch-in-backbonejs.html adresine bakın.

+5

Bu cevap bana çok daha temiz olduğunu hissettiriyor ve diğer özelliklerden kendinizi sınırlamamanıza izin veriyor .fetch() daha sonra kullanmak isteyebileceğiniz özelliklere sahip. –

+0

Bu, doğru arama ve model oluşturmayacaktır. – htmldrum

+2

@JRM Lütfen genişletebilir misiniz? – briangonzalez

3

Böyle bir şey kullanıyorum:

$.when($.ajax(URL, { dataType: "json" })) 
    .then($.proxy(function(response) { 
      ctx.view.collection.reset(response);        
    },ctx)); 

ana nokta beeing ben collection.reset(data) koleksiyonunu kullanın

+1

Sadece bir nitpicking noktası. $ .ajax bir söz değil ve bu nedenle yukarıdaki kod $ .when() dışında yeniden belirtilebilir, yani: $ .ajax (...). Sonra (...), iyi çalışması gerekir? Yine de koleksiyondaki güzel çalışmalar. – seebiscuit

30

Backbone koleksiyonunu yeniden başlatmak için yeni veri eklemek ve sıfırlama ayarlamak için iki yöntem vardır. Diyelim ki gelen verilerle tüm koleksiyon verileri değiştirmek için ve sıfırlama kullanmak bunun istediğinizi varsayalım: Eğer fetch için özel bir "dekoratör" eklemek istiyorsanız

App.carClc = Backbone.Collection.extend({ 
model : App.cardModel, 
url : 'http://localhost/bbtest/data.php', 
fetch : function() { 
    // store reference for this collection 
    var collection = this; 
    $.ajax({ 
     type : 'GET', 
     url : this.url, 
     dataType : 'json', 
     success : function(data) { 
      console.log(data); 
      // set collection data (assuming you have retrieved a json object) 
      collection.reset(data) 
     } 
    }); 
} 
}) 
+0

çok teşekkür ederim. –

+0

collection.reset (veri), saatlerce aranan – max4ever

2

Eğer sözlere ilişkin "thenable" getirme tutmak istiyorum, o zaman da böyle bir şey yapabileceğini: Her model ve/veya toplanması için bunu yapmak gerekiyorsa

fetch: function() { 
    var self = this, 
     deferred = new $.Deferred(); 

    $.get(this.url).done(function(data) { 
      // parse data 
     self.reset({parsed data}); 
     deferred.resolve(); //pass in anything you want in promise 
    }); 
    return deferred.promise(); 
} 
0

, Backbone.ajax geçersiz kılar.

Backbone.ajax'u geçersiz kılmak, normal olarak $.ajax'a iletilecek olan options isteğini verir. Yalnızca $.ajax (veya diğer bir Promise) yanıtını döndürmeniz ve koleksiyonda/modelde malzeme ayarlaması hakkında endişelenmenize gerek yoktur.