Автоматическое расширение события из базового представления
У меня есть базовый класс для всех представлений, а затем в каждом разделе приложения, например профилях, у меня также есть базовый класс. Таким образом, общие шаблоны и свойства могут использоваться во всем моем приложении на многих уровнях.
Я знаю, что если вы сделаете свойство события в представлении Backbone функцией вместо объектного литерала, оно будет создано для вас, я не уверен, как использовать это в моих интересах. Мой вопрос в том, что лучший способ автоматически продлить события, созданные в базовом представлении.
Я знаю одну возможность, когда я, на инициализацию вида, выбираю базовый класс событий и расширяю свое текущее событие на него, но он кажется немного взломанным, и мне придется дублировать этот код во всех представлениях. Если вы знаете лучший способ, поделитесь им.
Спасибо.
Ответы
Ответ 1
var ParentView = Backbone.View.extend({
'events': {
'click .parent-something': "onParentSomethingClick"
}
});
var ChildView = ParentView.extend({
'events': _.extend({
'click .something': 'onSomethingClick',
}, ParentView.prototype.events)
});
Это ничего не делает, но это самый простой способ, который я видел до сих пор.
Я также создал сущность по другому пути, который использовал: https://gist.github.com/1271041
Ответ 2
Здесь, как я расширяю родительские представления событий в своем дочернем представлении:
var ParentView = Backbone.View.extend({
events: {
'click .link': 'onLinkClick'
}
});
var ChildView = ParentView.extend({
events: function(){
return _.extend({
'click .something': 'onSomethingClick',
}, this.constructor.__super__.events);
}
});
Примечание: это работает только с базой 0.5.3. Перед этой версией нельзя определить события как функцию.
Ответ 3
Я считаю, что ответ JohnnyO - лучший. Однако я натолкнулся на два других способа сделать это, и я вставлю их сюда.
Жаль, что нет "автоматического" решения, которое не требует дополнительного рукописного кода в каждом новом представлении, но это то, что оно есть.
ChildView = ParentView.extend({
name: 'ChildView',
events: {
},
constructor: function(){
this.events = _.extend( {}, ParentView.prototype.events, this.events );
console.debug( this.events );
ParentView.prototype.constructor.apply( this, arguments );
},
someFunc: function(){
console.debug('someFunc; this.name=%s', this.name);
}
});
По Paul - backbone.js вид наследования. `this` в родительском файле
Я не знал, что вы можете предоставить метод конструктора в вашем Backbone.view.extend. Полезно знать.
var GenericView = Backbone.View.extend({
genericEvents: { 'click .close': 'close' },
close: function() { console.log('closing view...'); }
});
var ImplView = GenericView.extend({
events: { 'click .submit': 'submit' },
initialize: function(options) {
// done like this so that genericEvents don't overwrite any events
// we've defined here (in case they share the same key)
this.events = _.extend(this.genericEvents, this.events);
this.delegateEvents()
}
});
По rulfzid - Sub Class a Backbone.View Подкласс и сохранение событий
Я уже предусмотрел (и отклонил) этот подход, но у этого есть добавленный поворот вызова вашего базового события чем-то другим, чтобы "genericEvents не перезаписывали какие-либо события", как говорит автор. Если он не говорит о каком-то замалчивании обоих событий, вы проходите внутри объекта обоих событий, я не уверен, о чем он говорит, я бы просто использовал proto или прототип для ссылки на родителей Мероприятия. Но опять же, хорошо знать.