Uncaught TypeError: Невозможно вызвать метод "replace" из undefined backbone.js

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

uncaught TypeError: Не удается вызвать метод "replace" из undefinedBackbone.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>

спасибо

Ответ 1

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

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

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

_.template(undefined)

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

Существует несколько простых решений:

  • Откорректируйте свой <script> порядок, чтобы ваш #tmpl_sourcelist появился, прежде чем пытаться загрузить ваше представление.
  • Создайте скомпилированную функцию шаблона в вашем представлении initialize вместо определения "класс":

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

Что касается tagName, то прекрасное руководство говорит следующее:

el view.el

[...] this.el создается из свойств вида tagName, className, id и attributes, если это указано. Если нет, el - пустой div.

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

tagName: 'li'

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