2013-08-13 4 views
1

Я недавно пробовал использовать Backbone и хотел задать основной вопрос. Эта точка зрения рендеринга, как и следовало ожидать:Функция инициализации Backbone.js - зачем мне это нужно?

(function($){ 

var ListView = Backbone.View.extend({ 
tagName: 'div', 
el: $('header'), 

initialize: function(){ 
    _.bindAll(this, 'render'); 

    this.render(); // not all views are self-rendering. This one is. 
}, 


render: function(){ 
    $(this.el).html("<ul> <li>hello world</li> </ul>"); 
} 
}); 

    var listView = new ListView(); 
})(jQuery); 

Мой вопрос, почему я не могу просто обойтись без функции инициализации и поставить это:

(function($){ 


var ListView = Backbone.View.extend({ 
tagName: 'div', 
el: $('header'), 


render: function(){ 
    $(this.el).html("<ul> <li>hello world</li> </ul>"); 
} 
}); 

this.render(); //No html is rendered on the page 


var listView = new ListView(); 
})(jQuery); 

Я посмотрел в источнике код и функция инициализации по умолчанию были пустой функцией, что меня удивляло. Я чувствую, что ответ довольно прямолинейный, был бы оценен мудростью более опытного разработчика Backbone.js. Благодаря!

+0

Вы не всегда нужна функция инициализации (в вашем случае, например, вы можете просто вызвать метод визуализации, когда вы его экземпляр), но это очень полезно, когда вам необходимо пройти в определенных вариантах вашего представления, когда вы его создаете или выполняете некоторую настройку. – Jack

ответ

2

Я думаю, проблема в том, что в точке, которую вы вызываете this.render(), «это» относится к контексту модуля, а не к представлению «Магистральный вид». Если вы реорганизуете код для удаления строки this.render() и добавьте listView.render() после создания экземпляра listView, он должен решить проблему.

Таким образом, в этом случае вам не нужна функция initialize.

+1

Кроме того, определяя функцию 'initialize', она вызывается, когда представление сначала создается, определяется как чтение, иначе дополнительные параметры, которые вы хотите установить, должны вызываться при создании нового представления, т.е. 'var listView = новый ListView ({model: SearchModel})' –

+0

Да, если он удаляет необходимость вызывать визуализацию позже и фактически делает ее самообновлением –

2

Try This

(function ($) { 
    var ListView = Backbone.View.extend({ 
     tagName: 'div', 
     el: $('header'), 
     render: function() { 
      $(this.el).html("<ul> <li>hello world</li> </ul>"); 
     } 
    }); 

    var listView = new ListView(); 
    // Call render on the view instance 
    listView.render(); 
})(jQuery); 
+0

Так что же я сказал без объяснения причин, почему это не удалось? –

+0

, но с очень полезным примером кода! –

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