27

当您覆盖主干同步时,模型/集合 .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,难道不应该有更好的明显方法吗?我可能只是找不到它。

谢谢!

4

5 回答 5

56

You could also try instanceof like so:

Backbone.sync = function(method, model, options) {
  if (model instanceof Backbone.Model) {
    ...
  } else if (model instanceof Backbone.Collection) {
    ...
  }
}
于 2012-06-20T17:40:08.247 回答
10

@fiskers7's answer works with deep extension :

        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
于 2012-08-10T10:37:57.833 回答
2

这同样是骇人听闻的,但是 Backbone 集合具有模型属性,而模型没有——它本身就是模型。

也许更安全的方法是 model.toJSON() 并查看结果是对象还是数组。无论如何,您可能会在自定义 Backbone.sync 中使用 model.toJSON() ,因此尽管这在计算上非常昂贵,但无论如何都会发生。

于 2012-04-18T07:21:06.037 回答
1

我不完全确定我对此的感受,因为它似乎有点骇人听闻,但我无法完全想到为什么现在它会非常糟糕。

绝对简单,并且比“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; }
于 2014-02-27T00:01:13.893 回答
0

你可以做这样的事情。

Backbone.Model.prototype.getType = function() {
    return "Model";
}

Backbone.Collection.prototype.getType = function() {
    return "Collection";
}

if(model.getType() == "Model") {}
if(model.getType() == "Collection"){}
于 2012-04-18T07:27:41.353 回答