我有一个FormView来处理诸如保存和取消之类的事件。我还有一个AjaxFormView,它通过ajax处理保存,取消和获取表单。我有一个AssetFormView处理保存,取消,通过ajax,删除和打印。 等等等等。有相当多的重复。
我发现了这篇文章的帖子http://kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html
他表示你可以扩展视图。但是,我发现当我在页面上有多个版本的视图时,有一些属性交叉授粉。是否没有内置的方法来继承骨干中的视图,这是安全的吗?
谢谢,
Raif
* 嗯,这个东西很厚,我目前的异花授粉问题可能(可能是)是我的一些错误的结果,但问题仍然存在,是不是和在某种程度上继承观点会不是一个重要的特征?
答案 0 :(得分:2)
当你说你的房产是交叉花粉时,我想看看你的意思。
View.extend
机制运作良好。但请注意,您正在使用新功能扩展一个原型。通过原型继承,原型与新实例共享它的对象。
我猜你说当你说你的属性是“交叉传播”时,你实际上是在做这样的事情:
var baseModel = Backbone.Model.extend({
defaults: {
foo: { bar: "baz" }
}
});
由于对象是共享的,baseModel
的每个实例最终都会为foo
提供相同的对象,给人一种交叉授粉的感觉。
相反,如果您将默认值定义为函数,那么每个实例都将获得它自己的foo
对象副本,并且您的异花授粉就会消失。
var baseModel = Backbone.Model.extend({
defaults: function() { return {
foo: { bar: "baz" }
} }
});
当然,没有代码,我们无法确定您的问题是什么。只知道这个机制在社区中得到了很好的使用而没有遇到麻烦。这很安全。你只需要了解发生了什么。
答案 1 :(得分:0)
我不确定这是否与您遇到的问题相同,但我希望在父类中定义一些事件,然后让子类扩展属性而不覆盖它。
如果我这样做的话,那我就压倒了父母所定义的内容:
App.parent = Backbone.View.extend({
events: {
'click #button-add': 'onAddButtonClicked'
'click #button-delete': 'onDeleteButtonClicked'
}
onAddButtonClicked: function() {
console.log('onAddButtonClicked');
},
onDeleteButtonClicked: function() {
console.log('onDeleteButtonClicked');
}
});
App.child = App.parent.extend({
initialize: function() {
// This looks redundant but it seems to protect App.parent::events
this.events = _.extend({}, this.additionalEvents, this.events);
// THIS IS WRONG and results in errors when I have multiple childdren:
_.extend(this.events, this.additionalEvents); // <-- this seems to change the parent
}
additionalEvents: {
'click #button-additional': 'onOtherButtonClicked'
},
onOtherButtonClicked: function() {
console.log('child:onOtherButtonClicked');
}
});
扩展父母的事件时:
_.extend(this.events, this.additionalEvents);
我得到“未捕获错误:方法'onOtherButtonClicked'不存在”因为我正在修改App.parent的事件字段。 App.child2
因为无法看到App.child
所发生的事件而被炸毁。
将其更改为:
this.events = _.extend({}, this.additionalEvents, this.events);
我能够保护父母。