backbone.js: событие запуска при отображении представления

Я разрабатываю веб-приложение с Resthub, поэтому на передней стороне есть стек backbone.js. Мне нужно вызывать метод каждый раз, когда отображается новое представление (а также всевозможные подпредставления), чтобы добавить некоторые специфические вещи Twitter-Bootstrap (помощь-всплывающие окна, вид быстрой справки, которые получают свои параметры из глобального файла json, поэтому тексты помощи легче поддерживать).

Насколько я знаю, нет встроенного в магистраль события, которое запускается каждый раз при отображении представления.

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


person morten.c    schedule 27.08.2013    source источник
comment
Как вы вызываете render() неявно? Тем не менее, AFAIK, вы не можете. Причина в том, что ваши представления переопределяют Backbone.View. Что вы можете сделать, так это иметь ваш фактический код рендеринга в другом методе и исправить Backbone.View.render, чтобы вызвать этот метод и запустить событие. Таким образом, в вашем агрегаторе событий или в том, что вы используете для создания экземпляров представлений, вы все равно будете вызывать render. Внутри представления будут вызывать _render или как бы вы ни назвали метод и вызвать событие. Надеюсь, это имеет смысл…   -  person j03w    schedule 27.08.2013


Ответы (1)


Если вы хотите что-то сделать (запустить событие или что-то еще) для всех случаев, когда вызывается метод рендеринга, самым прямым способом может быть обновление метода рендеринга в вашей копии исходного кода Backbone (при условии, что вы хотите, чтобы поведение проэкт). По умолчанию метод рендеринга просто возвращает «это»

render: function() {
  return this;
},

Если есть что-то, что вы всегда хотите сделать перед рендерингом, вы можете добавить это в методе рендеринга.

render: function() {
  //add your extra code/call
  return this;
},

В качестве альтернативы вы также можете переопределить прототип функции Backbone.View и обновить/создать свои собственные версии, например

_.extend(Backbone.View.prototype, Backbone.Events, {
 render: function() {
    console.log('This is a test');
  return this;
}
});

var testView = Backbone.View.extend({
});

var testview = new testView();
testview.render();   //displays This is a test

//any view rendered will now have the console log

Сделав еще один шаг вперед, вы можете добавить свою собственную версию рендеринга, назвав ее, скажем, «myrender» и/или добавить свои собственные события, скажем, «myevent», которые затем могут быть вызваны до/после вызова render/myrender.

_.extend(Backbone.View.prototype, Backbone.Events, {
 render: function() {
    //console.log('This is a test');
  this.mynewevent();
  return this;

 },
 myrender: function() {
    console.log('Pre-render work');
    this.render();
 },
 mynewevent: function() {
    console.log('New Event work');
 }
});

var testView = Backbone.View.extend({
});

var testview = new testView();
//testview.render();
testview.myrender();

Здесь используется расширение Underscore, и, поскольку Backbone зависит от Underscore, если вы используете Backbone, Underscore также должен быть доступен для вас.

person PJR    schedule 27.08.2013
comment
+1 Точно мои мысли! Рендеринг не требует операций, поэтому расширяйте прототип, если вам нужна функциональность во всех представлениях. - person GijsjanB; 28.08.2013
comment
Большое спасибо, я думаю, что расширение подчеркивания - это именно то, что я искал. Я не хотел менять исходный файл бэкбона, так как могло случиться так, что другой разработчик переключит версию бэкбона, и мои изменения пропадут (поскольку мы используем git, не такая уж большая проблема, но все же подвержена ошибкам). Начинаю любить подчеркивание все больше и больше ;-). - person morten.c; 29.08.2013