2011-04-30 137 views
3

使用主幹我可以fetch集合像下面並呈現每個記錄的骨幹網查看:骨幹JS手柄保存模型?

Person = Backbone.Model.extend({}); 

var PersonCollection = Backbone.Collection.extend({ 

    model: Person, 
    url: '/home/people/' 
}); 

當我旋轉起來使用骨幹象下面這樣一個新的人,是不是應該已經處理.save ()功能發佈到上面集合中定義的URL?

var p = new Person({ Name: 'Andrew', Age: 24 }); 
p.save(); 
// Uncaught Error: A 'url' property or function must be specified 
// I thought it was supposed to use the Collection's URL? 
// I can get around this by explicitly setting p.URL but doesn't seem right 
+1

當您依賴收集URL時,必須將您的Person包含在該收集中,然後才能發出保存...否則骨幹網無法知道該網址是什麼。 – Julien 2011-05-05 20:50:55

+1

你意識到你可以在你的'Model.extend'調用中設置'collection',它會從集合中獲得'url' – Raynos 2011-06-14 21:42:21

回答

7

看起來像一個方法是使用當前的收集和create處理它增加了收集並保存

this.people.create(p); 

的源代碼如下。創建不在集合中,因此它將Models集合設置爲this然後,一旦保存成功,它將Model添加到集合中。因此,通過該模型的getURL,使用getURL看型號,這又再次通過收集到的getURL ......這樣,我們就不必重新定義URL URL屬性...

create : function(model, options) { 
    var coll = this; 
    options || (options = {}); 
    if (!(model instanceof Backbone.Model)) { 
    model = new this.model(model, {collection: coll}); 
    } else { 
    model.collection = coll; 
    } 
    var success = function(nextModel, resp) { 
    coll.add(nextModel); 
    if (options.success) options.success(nextModel, resp); 
    }; 
    return model.save(null, {success : success, error : options.error}); 
}, 
5

根據Backbone.sync中的backbone.js代碼,這似乎並不是這種情況。也許文檔是舊的或不正確的。代碼如下:

// Helper function to get a URL from a Model or Collection as a property 
// or as a function. 
var getUrl = function(object) { 
    if (!(object && object.url)) throw new Error("A 'url' property or function must be specified"); 
    return _.isFunction(object.url) ? object.url() : object.url; 
}; 

這暗示了模型需要自己的url。所以,你應該只是這樣做:

Person = Backbone.Model.extend({ 
    url: function() { 
    if (this.isNew()) return '/home/people/'; 
    return '/home/whatever-this-route-would-be'; 
    } 
}); 
6

只需將收集

Person.collection = PersonCollection

現在,它會奇蹟般地知道的URL。