0

ViewメソッドからViewのモデルにアクセスできます-のようにrender()(そのmodelプロパティを介して)。ただし、さまざまなモデルがあり、それらを同じタイプのビューで使用し、必要に応じてビューのmodelプロパティを変更するとします。

ビューから、使用しているモデルのタイプをどのように判断できますか?

var Model1 = Backbone.Model.extend();
var Model2 = Backbone.Model.extend();

var MyView = Backbone.View.extend({
  render:function(){
    console.log(" you're using: "+ model); // how to determine here is it using Model1 or Model2
  }
})

var mv1 = new MyView({model: new Model1()})
var mv2 = new MyView({model: new Model2()})
4

2 に答える 2

2

オブジェクトには名前ではなくアイデンティティがあります。 オブジェクトを作成したコンストラクターの名前(オブジェクトのタイプと見なすことができます。ECMAScript仕様を参照)を知りたい場合、防弾アプローチは、その情報を構築されたオブジェクトの一部にすることです。

var Model1 = Backbone.Model.extend({type: "Model1"});
var Model2 = Backbone.Model.extend({type: "Model2"});

var MyView = Backbone.View.extend({
  render: function () {
    console.log("You are using " + this.model.type);
  }
});

var mv1 = new MyView({model: new Model1()});
var mv2 = new MyView({model: new Model2()});

typeこのように、モデルオブジェクトはプロトタイプチェーンを介してプロパティを継承します。http://backbonejs.org/#View-renderも参照してください。

代替の、効率が低く、信頼性の低いソリューションには、次のものがあります。

  • コンストラクターに名前を付けて、それにアクセスします。

    var Model1 = Backbone.Model.extend();
    Model1.name = "Model1";
    
    var MyView = Backbone.View.extend({
      render: function () {
        console.log("You are using " + this.model.constructor.name);
      }
    });
    
    var mv1 = new MyView({model: new Model1()});
    var mv2 = new MyView({model: new Model2()});
    

    nameコンストラクターが

    var Model1 = function Model1 () {
      // …
    };
    

    また

    function Model1 ()
    {
      // … 
    }
    

    しかし、それは–残念ながら– Backbone.jsの方法ではありません。)

  • Functionコンストラクターなどの名前付きインスタンスの文字列表現を解析します。しかし、それは実装に依存します:

    var Model1 = function Model1 () {
      // …
    };
    
    var MyView = Backbone.View.extend({
      getModelName: function () {
        var aFunction = this.model.constructor;
        return (aFunction != null && typeof aFunction.name != "undefined" && aFunction.name)
          || (String(aFunction).match(/\s*function\s+([A-Za-z_]\w*)/) || [, ""])[1];
      },
    
      render: function () {
        console.log("You are using " + this.getModelName());
      }
    });
    

    jsx.object.getFunctionName()として実装されています。ただし、Backbone.jsではAIUIを完全に使用することはできません。)

  • instanceofDashKの回答で提案されているように使用します。しかし、それはあなたにすぐにまたは確実に情報を与えるものではありません。プロトタイプチェーンに最も重要な名前を最初に配置し、プロトタイプチェーンを変更するたびにメソッドを変更する必要があるため、そうしないと、誤検知と誤検知が発生します。

    var MyView = Backbone.View.extend({
      render: function () {
        var modelName = "an unknown model";
    
        if (this.model instanceof Model1)
        {
          modelName = "Model1";
        }
        else if (this.model instanceof Model2)
        {
          modelName = "Model2";
        }
        else if (this.model instanceof Supermodel)
        {
          modelName = "Supermodel";
        }
    
        console.log("You are using " + modelName);
      }
    });
    
于 2012-10-26T22:56:07.057 に答える
1

これをシンプルに保つ...

var Model1 = Backbone.Model.extend();
var Model2 = Backbone.Model.extend();

var MyView = Backbone.View.extend({
  render:function(){
    if (this.model instanceof Model1) {
      alert("You're using model1");
    }
    else if (this.model instanceof Model2) {
      alert("You're using model2");
    }
    else {
      alert("I've no idea what you're using");
    }
  }
})

var mv1 = new MyView({model: new Model1()});
var mv2 = new MyView({model: new Model2()});
mv1.render();
mv2.render();
于 2012-10-27T00:10:01.207 に答える