27

バックボーン同期をオーバーライドする場合、model / collection .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
}

「安全な」ベストプラクティスを探していると思います。もちろん、モデルまたはコレクションだけが持つ特定の属性またはメソッドをチェックすることはできますが、それはハックのようです。もっと明白な方法があるべきではありませんか?そして、おそらく私はそれを見つけることができなかったでしょう。

ありがとう!

4

5 に答える 5

56

instanceof次のようにすることもできます。

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の答えは、深い拡張で機能します:

        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 に答える