2013-07-12 4 views
1

У меня есть что-то вроде этого:Неожиданное поведение при расширении ItemView в Backbone марионеток

MyView = Backbone.Marionette.ItemView.extend({ 

templateHelpers: function() { 
    return { 
     imageName: function() { 
      var img = this.name.toLowerCase().replace(" ", "_"); 
      return img; 
     } 
    } 
}, 
myFunc: function() {//something} 

//lots of other stuff 


}) 

MySecondView = MyView.extend({ 

    myFunc: function() {//something} 

}) 

Мотивом для этого является то, что я хочу переписана функция MyFunc во втором использовании ItemView, но в противном случае это то же самое.

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

ответ

3

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

Так в функции инициализации MySecondView объекта вам необходимо вставить строку:

MyView.prototype.initialize.call(this); 

Update

Поскольку Marionette templateHelpers (когда его функция) автоматически вызывается представлением при его создании, вам необходимо объединить все возвращаемые значения по цепочке прототипов. Марионет не будет делать это автоматически. Так что в вашем случае, вы хотите сделать что-то подобное в MySecondView:

MySecondView = MyView.extend({ 

    myFunc: function() {//something} 

    templateHelpers: function() { 
     return _.extend({ localHelper: function() { 
               // something interesting 
          }}, MyView.prototype.templateHelpers.call(this)); 

    }, 

}) 

Я добавил помощник в localHelper шаблона в производном зрении, которая распространяется наследуемое templateHelpers вернуть объект в качестве примера. Было бы неплохо, если производное представление просто вызвало функцию базовых (супер) объектов, но это не работает. Этот подход, хотя и не то, что вы ожидали, позволяет вам наследовать помощников из унаследованных представлений и добавлять к ним в производном виде. Для большинства функций, которые вы добавляете к своему представлению самостоятельно, вам не нужно это делать. Однако есть встроенные функции просмотра, такие как этот, initialize, events и т. Д., Которые вам нужно управлять таким образом.

+0

Спасибо. Я вижу логику. Но это не исправить. Функция initialize вызывается в MySecondView, но ошибка (не может найти templateHelper) возникает до того, как инициализация запускается в «parent». Инициализация никогда не запускается родителем. –

+0

А я вижу, что это особый случай из-за того, как работает марионетка. Я уточню свой ответ. – dcarson

+0

templateHelpers не существует на прототипе MyView в точке, где templateHelpers вызывается в MySecondView. (Опять, инициализация еще не была вызвана в MyView?) ... Нужно ли мне что-то делать в MyView, чтобы сделать так, чтобы на нее накладывался templateHelpers - как и мои пользовательские функции? –

Смежные вопросы