2012-04-18 18 views
27

バックボーン同期をオーバーライドすると、モデル/コレクション.save()/ fetch()は同じバックボーン同期方法を使用するため、 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を試みることができる:fiskers7の答え@

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

これは同様にハッキリですが、バックボーンコレクションにはモデルプロパティがあり、モデル自体はモデルではありません。それ自体はモデルです。

恐らくもっと安全なメソッドはmodel.toJSON()であり、結果がオブジェクトか配列かどうかを確認することができます。とにかくあなたのカスタムBackbone.syncのmodel.toJSON()をモデル化するつもりです。これはかなり計算的に高価ですが、とにかく起こります。

+0

Upvote私がチェックしていたので、昨日、いくつかの素早いコーディングで 'length'プロパティ(コレクションのみ?比較すると「モデル」のチェックが鮮やかです。ハハ。 – eightyfive

+3

将来変更され、コードが破損する可能性があるため、皆さんはこのようなことを考慮しないでください。記述されているようにinstanceofキーワードを使用してください: –

0

あなたはこのようなことをすることができます。

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

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

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

アプリケーションがより複雑になるときは、維持することはほとんど不可能です。そして、オブジェクトがバックボーンオブジェクトのタイプではなく、Carのタイプについて話すgetType()メソッドを必要とする場合はどうなりますか? –

+0

@NicolasZozolは同意しない。どのようにこれを維持するのが難しいか分からず、第2のポイントは単に不公平です。あなたはあなたが望むところで上記のメソッドを呼び出すことができます。たとえば 'getBackboneObjectType'のように、名前の競合が発生しないことは間違いありません。 –

+0

これが悪い理由は、実装者が第三者のライブラリに含まれるオブジェクト型を追跡し、新しい型がBackboneの将来のバージョンに導入されるたびに新しいgetTypeプロトタイプを作成する必要があるからです。さらに、instanceofを使用すると、JavaScriptコンパイラ(node.jsなど)でスペルミスを検出することができ、コンパイルに失敗することがあります。 Backboneの更新版では名前が変わり、壊れた変更を識別しやすくなります。 –

10

は深い拡張子で動作します:

 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; } 
関連する問題