Javascript 具有多个型号的主干收集?
我在学习脊梁骨 我想创建一个列表,其中可以包含具有不同属性的不同模型 例如,以任意顺序列出文件夹内容,其中可能包括file类型的模型和folder类型的模型Javascript 具有多个型号的主干收集?,javascript,backbone.js,backbone.js-collections,Javascript,Backbone.js,Backbone.js Collections,我在学习脊梁骨 我想创建一个列表,其中可以包含具有不同属性的不同模型 例如,以任意顺序列出文件夹内容,其中可能包括file类型的模型和folder类型的模型 file : { title : "", date : "", type : "", yaddayadda : "" } folder : { title : "", date : "", haminahamina : "" } 在主干中表示这一点的正确方式是什么?是否可以将一个集合与多个模型结合起来?创建一
file : {
title : "",
date : "",
type : "",
yaddayadda : ""
}
folder : {
title : "",
date : "",
haminahamina : ""
}
在主干中表示这一点的正确方式是什么?是否可以将一个集合与多个模型结合起来?创建一个基础模型,其他模型从中继承:
var DataModel = Backbone.Model.extend({
// Whatever you want in here
});
var FileModel = DataModel.extend({
// Whatever you want in here
});
var FolderModel = DataModel.extend({
// Whatever you want in here
});
并使集合的模型
类型与基本模型相同:
var DataCollection = Backbone.Collection.extend({
model: DataModel
});
你也可以这样做。查看文档 基本上,在本例中,您将创建不同的模型,并添加一个tie-breaker属性,如“type”
var file = Backbone.Model.extend({
defaults: {
// will need to include a tie breaker attribute in both models
type: 'file'
}
}),
folder = Backbone.Model.extend({
defaults: {
// tie breaker
type: 'folder'
}
});
var fs = Backbone.Collection.extend({
model: function(model, options) {
switch(model.type) {
case 'file':
return new file(model, options);
case 'folder':
return new folder(model, options);
}
}
});
// after that just add models to the collection as always
new fs([
{type: 'file',name: 'file.txt'},
{type: 'folder',name: 'Documents'}
]);
在这种情况下,主干不完整。当与merge:true
选项和idAttribute
一起使用时,它将不起作用。在这种情况下,您需要:
var ModelFactory = function (attr, options) {
switch (attr.type) {
case 'file':
return new file(attr, options);
case 'folder':
return new folder(attr, options);
}
};
ModelFactory.prototype.idAttribute = '_id';
var fs = Backbone.Model.extend({
model: ModelFactory
});
谢谢你的回复。将数据收集传递给要呈现的视图时,如何呈现属于FileModel或FolderModel的属性?始终可以检查FileModel的
obj实例是否
(或FolderModel
)我也会这样做,但是您如何传递您所说的数据收集(AJAX调用)?如果是这种情况,您必须检查响应上是否存在唯一的属性(即,If(someModel.someUniqueProperty){//使用将处理该属性值的视图呈现它};)。重复:我喜欢这种方法,不仅是“主干方式”,而且不需要上面提到的额外业务逻辑@dennis,事实上,你根本不需要任何变通方法,因为它会像你期望的那样工作。另外,我相信您的意思是:var fs=Backbone.Collection.extend({
请注意,这会破坏这个.model.prototype.idAttribute
,因此您应该看看Maciej,它使用模型工厂.prototype.idAttribute
解决了这个问题。或者只需重写集合模型ID
函数以避免重复。模型工厂.prototype.idAttribute
在这里非常重要因为它避免了重复。重写集合modelId
函数将是等效的。
var bannedList = app.request('rest:getBan');
var whiteIpList = app.request("rest:getWhite");
var whiteGroupList = app.request("rest:....");
$.when(bannedList, whiteIpList, whiteGroupList).
done(function (bannedList, whiteIpList, whiteGroupList) {
var collection = new Backbone.Collection();
collection.add(bannedList);
collection.add(whiteIpList);
collection.add(whiteGroupList);
});
app.reqres.setHandler("rest:getBannedList", function (data) {
return API.getBannedList(data);
});
getBannedList: function (data) {
var user = new Backbone.Model();
user.url = '/banned';
user.cid = 'bannedList';
var defer = $.Deferred();
user.fetch({
type: 'GET',
data: data,
success: function (data) {
defer.resolve(data);
},
error: function (data) {
defer.reject(data);
}
});
return defer.promise();
},