您可以从View方法访问View的模型 - 例如render()
(通过其model
属性)。但是,假设您有许多不同的模型,并使用相同类型的View,在需要时更改视图的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()})
答案 0 :(得分:2)
对象具有标识,而不是名称。如果您想知道创建对象的构造函数的名称(可以将其视为对象的类型;请参阅the ECMAScript Specification ),防弹方法是使该信息成为构造对象的一部分:
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。)
按照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);
}
});
答案 1 :(得分: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();