2011-04-30 105 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。