0

您可以从 View 方法访问 View 的模型 - 就像render()(通过它的model属性)。但是假设您有许多不同的模型,并将它们与相同类型的视图一起使用,并在model需要时更改视图的属性。

如何从 View 中确定它使用的是什么类型的模型?

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。)

  • instanceof按照 DashK 的回答中的建议使用。但这并不能立即或可靠地为您提供信息。因为你必须把原型链中最重要的名字放在最前面,并且每当你改变原型链时都要改变方法,否则你会得到误报和漏报:

    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 回答