当你覆盖骨干同步时,模型/集合.save()/ fetch()都使用相同的骨干同步方法,那么检查Backbone.sync接收的是模型还是模型集合的最佳方法是什么?
举个例子:
Backbone.sync = function(method, model, options){
//Model here can be both a collection or a single model so
if(model.isModel()) // there is no isModel or isCollection method
}
我想我正在寻找一个“安全”的最佳实践,我当然可以检查某些属性或方法,只有模型或集合有,但似乎是hackish,不应该有更明显的方法吗?可能我找不到它。
谢谢!
答案 0 :(得分:56)
您也可以尝试instanceof
:
Backbone.sync = function(method, model, options) {
if (model instanceof Backbone.Model) {
...
} else if (model instanceof Backbone.Collection) {
...
}
}
答案 1 :(得分:10)
@ fiskers7的答案适用于深度扩展:
var Item = Backbone.Model.extend({
className : 'Item',
size :10
});
var VerySmallItem = Item.extend({
size :0.1
});
var item = new Item();
var verySmall = new VerySmallItem();
alert("item is Model ?" + (item instanceof Backbone.Model)); //true
alert("verySmall is Model ?" + (verySmall instanceof Backbone.Model)); //true
答案 2 :(得分:2)
这同样是hackish,但Backbone集合有一个模型属性,而模型没有 - 它本身就是一个模型。
也许更安全的方法是model.toJSON()并查看结果是对象还是数组。无论如何,你可能会在你的自定义Backbone.sync中使用model.toJSON(),所以尽管这在计算上非常昂贵,但无论如何它都会发生。
答案 3 :(得分:0)
你可以这样做。
Backbone.Model.prototype.getType = function() {
return "Model";
}
Backbone.Collection.prototype.getType = function() {
return "Collection";
}
if(model.getType() == "Model") {}
if(model.getType() == "Collection"){}
答案 4 :(得分:0)
我不完全确定我对此感觉如何,因为它看起来有些神圣,但我不能完全想到为什么它现在会非常糟糕。
绝对简单,比“instanceof”检查更快(我假设您不会在对象上命名任何其他函数“isBBModel / Collection”?)
Backbone.Model.prototype.isBBCollection = function() { return false; }
Backbone.Model.prototype.isBBModel = function() { return true; }
Backbone.Collection.prototype.isBBCollection = function() { return true; }
Backbone.Collection.prototype.isBBModel = function() { return false; }