2012-04-18 151 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; }