2011-07-18 16 views
6

URL'de kullanmak üzere bir koleksiyona bir kimlik iletmem gerekiyor (örneğin /user/1234/projects.json), ancak nasıl yapacağımı bilmiyorum, bir örnek şöyle olur: olağanüstü.Omurga seti toplama özniteliği (url için)

Uygulamamın yapılış şekli, kullanıma sunulduğunda 'kullanıcıların' çekilmesi ve oluşturulmasının bir koleksiyonudur, daha sonra bir kullanıcının 'belgelerini' tıklattığında sunucusundan yeni bir koleksiyona çekilip yeni bir dizide işlenmesini istiyorum. görünüm. Sorun, document.fetch() için ilgili URL'yi vermek üzere kullanıcı kimliğini belge koleksiyonuna getirmektir.

//in the the view initialize function  
    this.collection = new Docs(); 
    this.collection.project_id = this.options.project_id; 
    this.collection.fetch(); 

    //in the collection 
    url: function() { 
    return '/project/api/' +this.project_id+'/docs'; 
    } 
+0

benim için çalıştı. Teşekkürler! –

cevap

7

Kullanıcı toplama url/kullanıcı ayarlanması gerekir:


burada bir örnektir, ben buldum. Bu ayarlandıktan sonra, modelleriniz sihrini yapmak için bu URL'yi kullanmalıdır. Bir model koleksiyondaysa, 'url' yöntemini çağırmanın/user /: id değerini döndüreceğine inanıyorum (tamamen olumlu değil). Böylece tüm tipik REST-ish işlevleriniz '/ user /: id' üzerinde kullanılacaktır. Bir ilişki ile bir şey yapmaya çalışıyorsanız (kullanıcı çok sayıda belgeye sahip), bir çeşit durulama ve tekrarlama. Yani, doküman koleksiyonunuz için (hangi kullanıcı için doğru olan?), URL'yi 'user_instance.url/documents' olarak ayarlamanız gerekir.

(urlRoot için omurga 0.5.1 yükseltme), böyle bir şey yapacağını bir omurga modeli ile birçok ilişki bir tane göstermek için:

var User = Backbone.Model.extend({ 
    initialize: function() { 
     // note, you are passing the function url. This is important if you are 
     // creating a new user that's not been sync'd to the server yet. If you 
     // did something like: {user_url: this.url()} it wouldn't contain the id 
     // yet... and any sync through docs would fail... even if you sync'd the 
     // user model! 
     this.docs = new Docs([], {user_url: this.url}); 
    }, 
    urlRoot: '/user' 
}); 

var Doc = Backbone.Model.extend(); 

var Docs = Backbone.Collection.extend({ 
    initialize: function(models, args) { 
     this.url = function() { args.user_url() + '/documents'; }; 
    } 
}); 

var user = new User([{id: 1234}]); 
user.docs.fetch({ success: function() { alert('win') }); 
+0

Teşekkürler, bu bire çok. Açıkta kalmadığım şey, 'user_instance' belgesine nasıl ulaşılacağıdır (ana soruya bir örnek ekledim) –

+0

Şimdi anladım ... ekledi örnek. –

+0

2 yıl ve bu hala geçerli ve model URL'leri ayırmanın çok iyi bir yoludur. Özellikle Dokümanlar modelinin/dokümanları URL'ye eklemekten sorumlu olduğunu beğeniyorum. Backbone SSS, bunun Kullanıcı modelinin sorumluluğunda olduğunu öne sürüyor, fakat ben de aynı fikirdeyim - IMO bu şekilde daha temiz. – fiznool

5

Neden URL özelliğini geçersiz kılmak gerekiyor ?

this.collection = new Docs(); 
this.collection.project_id = this.options.project_id; 
this.collection.url = '/project/api/' + this.options.project_id + '/docs'; 
this.collection.fetch(); 
+0

Bu en iyi çözümdür. – SeanK

0

Craig Monson cevabını gibi ama Çalıştırmak için iki şey düzeltmek için gerekli: bir fonksiyonu ile koleksiyonun .. yapabileceğin

  • Dokümanlar

url işlevinden Dokümanlar

  • güncellendi örnek dönüş deyimi geçirmeden önce Kullanıcı url yöntemi Bağlama:

    var User = Backbone.Model.extend({ 
        initialize: function() { 
         // note, you are passing the function url. This is important if you are 
         // creating a new user that's not been sync'd to the server yet. If you 
         // did something like: {user_url: this.url()} it wouldn't contain the id 
         // yet... and any sync through docs would fail... even if you sync'd the 
         // user model! 
         this.docs = new Docs([], { user_url: this.url.bind(this) }); 
         }, 
         urlRoot: '/user' 
        }); 
    
    var Doc = Backbone.Model.extend(); 
    
    var Docs = Backbone.Collection.extend({ 
        initialize: function(models, args) { 
         this.url = function() { return args.user_url() + '/documents'; }; 
        } 
    }); 
    
    var user = new User([{id: 1234}]); 
    user.docs.fetch({ success: function() { alert('win') });