В документации Backbone указано:
Свойство events также можно определить как функцию, которая возвращает хэш событий, чтобы упростить программное определение ваших событий, а также наследовать их от родительских представлений.
Как наследовать родительские события просмотра и расширять их?
Родительский вид
var ParentView = Backbone.View.extend({
events: {
'click': 'onclick'
}
});
Детский вид
var ChildView = ParentView.extend({
events: function(){
????
}
});
javascript
backbone.js
backbone-events
казарка
источник
источник
parentEvents = _.result(ParentView.prototype, 'events');
вместо «ручной» проверки,events
является ли это функцией._.result
, которую я раньше не замечал. Для всех, кому интересно, вот jsfiddle с множеством вариаций на эту тему: jsfiddlethis
не необходимость вызова родительского класса по имени экземпляра. большое вам спасибо за это.Ответ солдата - хороший. Упрощая его, вы можете просто сделать следующее
Затем просто определите свои события в любом классе обычным способом.
источник
this.events
и вParentView.prototype.events
противном случае, если оба определяют обработчики для одного и того же события, обработчик Родителя переопределит дочерний.{},ParentView.prototype.events,this.events
delegateEvents
вызывается в конструкторе для привязки событий. Итак, когда вы расширяете его вinitialize
, почему еще не поздно?initialize
в нескольких случаях (а затем вам придется иметь дело с управлением иерархией этой функции) просто для того, чтобы объединить объекты событий. Мне кажется более чистым сохранитьevents
слияние внутри себя. При этом, я бы не подумал об этом подходе, и всегда приятно быть вынужденным смотреть на вещи по-другому :)Вы также можете использовать этот
defaults
метод, чтобы избежать создания пустого объекта{}
.источник
Если вы используете CoffeeScript и устанавливаете функцию на
events
, вы можете использоватьsuper
.источник
Не было бы проще создать специализированный базовый конструктор из Backbone.View, который обрабатывает наследование событий вверх по иерархии.
Это позволяет нам сокращать (объединять) хэш событий вниз по иерархии всякий раз, когда мы создаем новый «подкласс» (дочерний конструктор) с помощью переопределенной функции расширения.
Создав специализированное представление: BaseView, которое переопределяет функцию расширения, мы можем иметь подпредставления (например, AppView, SectionView), которые хотят наследовать объявленные события своего родительского представления, просто делая это путем расширения от BaseView или одного из его производных.
Мы избегаем необходимости программно определять наши функции событий в наших подпредставлениях, которые в большинстве случаев должны явно ссылаться на родительский конструктор.
источник
Краткая версия последнего предложения @ soldier.moth:
источник
Это также сработает:
Использование прямо
super
не работало для меня, либо вручную указыватьParentView
либо унаследованный класс.Доступ к
_super
var, который доступен в любом coffeescriptClass … extends …
источник
http://danhough.com/blog/backbone-view-inheritance/
источник
Для Backbone версии 1.2.3
__super__
работает нормально и даже может быть связан цепочкой. Например:... что - в
A_View.js
- приведет к:источник
В этой статье я нашел более интересные решения
Он использует super Backbone и hasOwnProperty ECMAScript. Второй из его прогрессивных примеров работает как шарм. Вот небольшой код:
Вы также можете сделать это для пользовательского интерфейса и атрибутов .
В этом примере не рассматриваются свойства, устанавливаемые функцией, но автор статьи предлагает решение в этом случае.
источник
Чтобы сделать это полностью в родительском классе и поддержать хэш событий на основе функций в дочернем классе, чтобы дети не зависели от наследования (дочерний элемент должен будет вызвать,
MyView.prototype.initialize
если он переопределяетinitialize
):источник
Это решение CoffeeScript сработало для меня (и учитывает предложение @ soldier.moth):
источник
Если вы уверены, что
ParentView
события определены как объект, и вам не нужно определять события динамически в,ChildView
можно дополнительно упростить ответ soldier.moth, избавившись от функции и используя_.extend
напрямую:источник
Шаблон для этого, который мне очень нравится, - это изменение конструктора и добавление некоторых дополнительных функций:
Я предпочитаю этот метод, потому что вам не нужно идентифицировать родительскую переменную, которую нужно изменить. Я использую ту же логику для
attributes
иdefaults
.источник
Вау, здесь много ответов, но я подумал, что предлагаю еще один. Если вы используете библиотеку BackSupport, она предлагает
extend2
. Если вы используете,extend2
он автоматически позаботится о слиянииevents
(а такжеdefaults
схожих свойствах) за вас.Вот небольшой пример:
https://github.com/machineghost/BackSupport
источник
extend2
) был лучшим, что я мог придумать, и я не думаю, что это все так ужасно: любой, кто использовал Backbone, уже привык к этомуextend
, поэтому им не нужно запоминать новую команду.