javascript - traductor - Colección Backbone con múltiples modelos?
backbone vs react (4)
Cree un modelo base heredado de sus otros modelos:
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
});
Y haga que el tipo de model
de la colección sea el mismo modelo base:
var DataCollection = Backbone.Collection.extend({
model: DataModel
});
Estoy aprendiendo Backbone.
Quiero crear una lista que pueda contener diferentes modelos, con diferentes atributos.
Por ejemplo, enumerar los contenidos de la carpeta, que pueden incluir modelos de tipo de archivo y modelos de tipo carpeta, en cualquier orden.
file : {
title : "",
date : "",
type : "",
yaddayadda : ""
}
folder : {
title : "",
date : "",
haminahamina : ""
}
¿Cuál es la forma correcta de representar esto en Backbone? ¿Es posible tener una sola Colección con múltiples modelos?
La documentación del backbone no está completa en este caso. No funcionará cuando se use con merge:true
opción merge:true
e idAttribute
. En ese caso, necesita:
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
});
También podrías hacerlo de manera vertebral. Mira la colección de backbone de documentos
Básicamente crearía diferentes modelos agregando un atributo de desempate, diga "tipo" en este caso.
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);
break;
case ''folder'':
return new folder(model, options);
break;
}
}
});
// after that just add models to the collection as always
new fs([
{type: ''file'',name: ''file.txt''},
{type: ''folder'',name: ''Documents''}
]);
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();
},