我想使用underscore.js覆盖Backbone模型的原型。这是我的代码:
_.extend(TableView.prototype, {
el: $("#" + this.id + "_div"),
});
总之,我希望默认情况下,模型附加到一个html元素,其id等于模型的id加上“_div”。模型的ID是TableView
的属性id
,我尝试使用this
访问模型。问题是我得到错误:“这是未定义的”。为什么呢?
PS:我知道正确的方法是将模型扩展为新模型。我想覆盖原始的一个,因为Backbone的extend()方法似乎不像类继承,my_new_object instanceof TheOldModel
返回false
。无论如何,我也会在TableView.extend()
时遇到同样的错误。
PPS:我正在扩展一些Splunk视图。
答案 0 :(得分:3)
评估您的代码段时,this
没有特定含义,并且设置为上下文。它只会在稍后发生的实例上下文中有意义。
如果要设置动态el
,请在实例化视图时提供要评估的函数:
var TableView = Backbone.View.extend({
el: function() {
return '#'+this.id+'_div';
}
});
var v = new TableView({id: 'x'});
console.log(v.$el.text());
http://jsfiddle.net/nikoshr/bcfhqq18/
或者,如果您更喜欢修改原型
TableView.prototype.el = function() {
return '#'+this.id+'_div';
}
http://jsfiddle.net/nikoshr/bcfhqq18/2/
最后,请注意,通过Backbone扩展类会设置原型链,并且在针对祖先类进行测试时,instanceof
应该为true:
var TableView = Backbone.View.extend({
});
var DeepTableView = TableView.extend({
el: function() {
return '#'+this.id+'_div';
}
});
var v = new DeepTableView({id: 'x'});
console.log(v instanceof Backbone.View); // true
console.log(v instanceof TableView); // true
console.log(v instanceof DeepTableView); // true