2013-02-12 7 views
11

Я пытаюсь разработать простое приложение RSS с помощью backbone.js. Я использую этот backbone.js tutorial. При определении шаблона я получаю следующую ошибку в строке 2 (шаблон). Может ли кто-то сказать мне, почему tagName: «li» определено в учебнике?uncaught TypeError: Невозможно вызвать метод «replace» undefined backbone.js

uncaught TypeError: Cannot call method 'replace' of undefined backbone.js

Javscript

window.SourceListView = Backbone.View.extend({ 
    tagName:"li", 
    template: _.template($('#tmpl_sourcelist').html()), 

    initialize:function() { 
     this.model.bind("change", this.render, this); 
     this.model.bind("destroy", this.close, this); 
    }, 

    render:function (eventName) { 
     $(this.$el).html(this.template(this.model.toJSON())); 
     return this; 
    }, 

    close:function() { 
     $(this.el).unbind(); 
     $(this.el).remove(); 
    } 
}); 

HTML

<script type="text/template" id="tmpl_sourcelist"> 
         <div id="source"> 
         <a href='#Source/<%=id%>'<%=name%></a> 
         </div> 
       </script> 

благодарит

+0

попробуйте запустить шаблон без данных и посмотреть, что вы получаете ... $ el.html (this.template()) – beNerd

+0

Ошибка в строке2 (шаблон: _.template ($ ('# tmpl_sourcelist') .html()),). Не знаете, что вы рекомендуете. – jsp

ответ

44

Вы получаете свою ошибку здесь:

template: _.template($('#tmpl_sourcelist').html()), 

Часть внутренностей _.template «s включает в себя вызов String#replace на неоткомпилированном тексте шаблона на пути к получению скомпилированного шаблона функции. Эта конкретная ошибка обычно означает, что вы эффективно говорить это:

_.template(undefined) 

Это может произойти, если не существует в DOM не #tmpl_sourcelist когда вы говорите $('#tmpl_sourcelist').html().

Есть несколько простых решений:

  1. Отрегулируйте <script> заказ так, что ваш #tmpl_sourcelist приходит, прежде чем пытаться загрузить вид.
  2. Создание скомпилированный шаблон функции в ваш взгляд-х initialize, а не в определении «класса» Взгляд в:

    window.SourceListView = Backbone.View.extend({ 
        tagName:"li", 
        initialize:function() { 
         this.template = _.template($('#tmpl_sourcelist').html()); 
         //... 
    

Насколько tagName идет, fine manual это сказать:

elview.el

[...] this.el is created from the view's tagName , className , id and attributes properties, if specified. If not, el is an empty div .

Так что, имея это на ваш взгляд:

tagName: 'li' 

означает, что Backbone автоматически создаст новый элемент <li> как ваш вид el вашего вида.

+0

отличный ответ! Это помогло мне в моей ситуации, потому что \t $ («# target»). Html (_. Template (template, [posts])); искал id = target, но это был класс. – Anthony

+0

@ Энтони: Спасибо. Таким образом, тогда та же проблема '_.template (undefined)' маскируется. –