Подтвердить что ты не робот

Автоматическое расширение события из базового представления

У меня есть базовый класс для всех представлений, а затем в каждом разделе приложения, например профилях, у меня также есть базовый класс. Таким образом, общие шаблоны и свойства могут использоваться во всем моем приложении на многих уровнях.

Я знаю, что если вы сделаете свойство события в представлении Backbone функцией вместо объектного литерала, оно будет создано для вас, я не уверен, как использовать это в моих интересах. Мой вопрос в том, что лучший способ автоматически продлить события, созданные в базовом представлении.

Я знаю одну возможность, когда я, на инициализацию вида, выбираю базовый класс событий и расширяю свое текущее событие на него, но он кажется немного взломанным, и мне придется дублировать этот код во всех представлениях. Если вы знаете лучший способ, поделитесь им.

Спасибо.

4b9b3361

Ответ 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 или прототип для ссылки на родителей Мероприятия. Но опять же, хорошо знать.