Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获得';类型';视图';s模型_Javascript_Backbone.js_Backbone Views_Backbone.js Collections_Backbone Model - Fatal编程技术网

Javascript 获得';类型';视图';s模型

Javascript 获得';类型';视图';s模型,javascript,backbone.js,backbone-views,backbone.js-collections,backbone-model,Javascript,Backbone.js,Backbone Views,Backbone.js Collections,Backbone Model,您可以从视图方法访问视图的模型,如render()(通过其model属性)。但假设您有许多不同的模型,并将它们与相同类型的视图一起使用,在需要时更改视图的model属性 如何从视图中确定它使用的模型类型 var Model1 = Backbone.Model.extend(); var Model2 = Backbone.Model.extend(); var MyView = Backbone.View.extend({ render:function(){ console.lo

您可以从视图方法访问视图的模型,如
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()})

对象具有标识,而不是名称。如果您想知道创建对象的构造函数的名称(可以视为对象的类型;请参阅),防弹方法是将该信息作为构造对象的一部分:

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
属性。另见

其他效率较低、可靠性较低的解决方案包括:

  • 给构造函数一个名称并访问该名称:

    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()});
    
    (如果构造函数是

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

    但不幸的是,这不是Backbone.js的方式。)

  • 解析命名的
    函数
    实例(如构造函数)的字符串表示形式。 但这取决于实施:

    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());
      }
    });
    
    (实现为.但同样,AIUI不能完全使用Backbone.js。)

  • 使用DashK回答中建议的
    instanceof
    。但这并不能立即或可靠地为您提供信息。 因为您必须首先在原型链中输入最重要的名称,并在更改原型链时更改方法,或者 将获得假阳性和假阴性:

    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);
      }
    });
    

对象具有标识,而不是名称。如果您想知道创建对象的构造函数的名称(可以视为对象的类型;请参阅),防弹方法是将该信息作为构造对象的一部分:

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
属性。另见

其他效率较低、可靠性较低的解决方案包括:

  • 给构造函数一个名称并访问该名称:

    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()});
    
    (如果构造函数是

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

    但不幸的是,这不是Backbone.js的方式。)

  • 解析命名的
    函数
    实例(如构造函数)的字符串表示形式。 但这取决于实施:

    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());
      }
    });
    
    (实现为.但同样,AIUI不能完全使用Backbone.js。)

  • 使用DashK回答中建议的
    instanceof
    。但这并不能立即或可靠地为您提供信息。 因为您必须首先在原型链中输入最重要的名称,并在更改原型链时更改方法,或者 将获得假阳性和假阴性:

    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);
      }
    });
    
    • 保持这个简单

      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();
      
      保持这个简单

      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();
      

      这有帮助吗?(我猜你在找类似“typeof”的东西)@Dashk是的。。。请把它贴出来作为回答。这有帮助吗?(我猜你在找类似“typeof”的东西)@Dashk是的。。。请将此作为回答,这里的关键词是“许多”。对于许多不同的模型,这种“简单”的方法变得不切实际。因为你不仅要为每一个新的模型类型添加一个分支,还要把它们按正确的顺序排列,这样“子类”总是排在“超类”之前。这里的关键词是“很多”。对于许多不同的模型,这种“简单”的方法变得不切实际。因为您不仅需要为每个新模型类型添加一个分支,还需要将它们按正确的顺序排列,以便“子类”总是排在“超类”之前。