2012-04-18 152 views
27

当您覆盖骨干同步时,model/collection .save()/ fetch()使用相同的骨干同步方法,那么检查if Backbone.sync收到的是一个模型还是一组模型?检查是否某个模型或集合在骨干js

举个例子:

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 
} 

我想我要寻找一个“安全”的最佳实践,我可以为某些属性,或者只是一个模型或集合有方法当然检查,但似乎哈克,不应该有更好的明显方式吗?而且我可能无法找到它。

谢谢!

回答

56

你也尝试instanceof像这样:

Backbone.sync = function(method, model, options) { 
    if (model instanceof Backbone.Model) { 
    ... 
    } else if (model instanceof Backbone.Collection) { 
    ... 
    } 
} 
2

这同样具有冒险性,但Backbone集合具有模型属性,而模型不具有 - 它本身就是模型。

也许一个更安全的方法是model.toJSON()并查看结果是对象还是数组。无论如何,您可能会在自定义的Backbone.sync中使用model.toJSON(),所以虽然这在计算上相当昂贵,但无论如何都会发生。

+0

给予好评,因为我是在检查在一些快速编码中,'length'属性(仅限Collection ...?!?)!检查“模型”是比较明智​​的。哈哈。 – eightyfive 2014-11-26 01:42:21

+3

你们不应该指望这样的东西,因为它们可能会在将来发生变化并破坏你的代码。按照描述使用instanceof关键字:) – 2015-02-16 09:41:41

0

你可以做这样的事情。

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

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

if(model.getType() == "Model") {} 
if(model.getType() == "Collection"){} 
+4

这是一个非常糟糕的主意,应用程序变得越来越复杂时几乎不可能维护。如果一个对象需要一个getType()方法来谈论一种Car而不是一种Backbone Object,会发生什么? – 2012-09-26 15:22:48

+0

@NicolasZozol不同意。我不明白这难以维持,第二点根本不公平。无论你想要什么,你都可以调用上述方法。例如'getBackboneObjectType',这肯定不会导致任何命名冲突。 – 2014-06-18 13:16:40

+0

这是不好的原因,它需要实施者跟踪包含在第三方库中的对象类型,并且每次将新类型引入未来版本的Backbone时,都会创建一个新的getType原型。另外,你暴露自己拼错类型没有真正简单的方法来检测它(因为它都是通过字符串比较完成的)。使用instanceof允许JavaScript编译器(如node.js)检测到任何拼写错误,并将编译失败名称会在更新后的Backbone版本中发生变化,从而使突变更容易识别。 – 2014-12-04 21:57:31

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 
0

我不完全相信我是怎么想的,因为它看起来有点冒失,但我不能完全想到为什么现在它会超级糟糕。

绝对简单,速度比一“的instanceof”检查(我假设你将无法在你的对象指定任何其他功能“isBBModel /集”?)

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; }