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()});
或 但不幸的是,这不是Backbone.js的方式。)var Model1 = function Model1 () { // … };
- 解析命名的
实例(如构造函数)的字符串表示形式。 但这取决于实施:函数
(实现为.但同样,AIUI不能完全使用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()); } });
- 使用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()});
或 但不幸的是,这不是Backbone.js的方式。)var Model1 = function Model1 () { // … };
- 解析命名的
实例(如构造函数)的字符串表示形式。 但这取决于实施:函数
(实现为.但同样,AIUI不能完全使用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()); } });
- 使用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是的。。。请将此作为回答,这里的关键词是“许多”。对于许多不同的模型,这种“简单”的方法变得不切实际。因为你不仅要为每一个新的模型类型添加一个分支,还要把它们按正确的顺序排列,这样“子类”总是排在“超类”之前。这里的关键词是“很多”。对于许多不同的模型,这种“简单”的方法变得不切实际。因为您不仅需要为每个新模型类型添加一个分支,还需要将它们按正确的顺序排列,以便“子类”总是排在“超类”之前。