2011-07-18 86 views
6

我需要將一個id傳遞給一個集合以在url中使用(例如/user/1234/projects.json),但我不知道如何做到這一點,一個例子是精彩。骨幹集合集合屬性(對於url)

我的應用程序結構化的方式是在啓動一個'用戶'集合被拉和呈現,然後我想當一個用戶被點擊時,他們的'文檔'從服務器拉到一個新的集合,並呈現在一個新的視圖。問題是將用戶標識放入文檔集合中,以提供documents.fetch()的相關URL。


想我已經知道了,這裏有一個例子:

//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

爲我工作。謝謝! –

回答

7

您的用戶集URL應設置爲/用戶。一旦設置好了,你的模型應該利用這個URL來發揮他們的魔力。我相信(不完全肯定),如果一個模型在一個集合中,調用'url'方法將返回/ user /:id。因此,所有典型的REST-ish功能都將在'/ user /:id'上使用。如果你想用關係做一些事情(一個用戶有很多文件),這是一種沖洗和重複。那麼,對於你的文檔集合(belogs to user correct?),你可以將url設置爲'user_instance.url/documents'。

要顯示一個與骨幹模型一對多的關係,你會做這樣的事情(升級到0.5.1骨幹爲urlRoot):

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

謝謝,這是一對多。我不清楚的是如何讓'user_instance'進入文檔集合(我已經爲主要問題添加了一個示例) –

+0

我想我現在明白了......增加了一個例子。 –

+0

2年過去了,這仍然是相關的,並且是分離出模型URL的一種非常好的方式。我特別喜歡Docs模型負責將/文檔添加到URL的方式。骨幹常見問題表明這是用戶模型的責任,但我不同意 - IMO這種方式更清潔。 – fiznool

5

爲什麼你需要重寫URL屬性?與函數的集合..你可以這樣做:

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

這是最好的解決方案。 – SeanK

0

我喜歡克雷格蒙森的答案,但得到它的工作,我需要解決兩件事情:

  • 綁定用戶URL方法將它傳遞給文檔
  • return語句從URL功能文檔

例如更新前:

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') });