Подчеркивание шаблона, изменяющего неопределенность

Я смотрел несколько видеороликов по теме магистральных js. Это пример прямо из видео. Это с 2012 года, поэтому я думаю, что основные правила/библиотека изменились, но я не могу понять, почему это не работает в данный момент. В видеоролике человек показывает, что он работает в скрипте JS, но я не могу заставить его работать. (Я включил необходимые библиотеки в JS Fiddle, т.е. Подчеркивание, магистраль и jQuery)

var V = Backbone.View.extend({
  el:'body',
  render: function () {
  	var data = { lat: -27, lon: 153 };
    this.$el.html(_.template('<%= lat %> <%= lon%>', data));
    return this;
  }
});

var v = new V();

v.render();
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://backbonejs.org/backbone-min.js"></script>

Ответ 1

Раньше вы могли анализировать и заполнять шаблон подчёркивания одним движением:

var html = _.template(template_string, data);

Но с Underscore 1.7.0 второй аргумент _.template содержит параметры шаблона:

шаблон _.template(templateString, [settings])

Компилирует шаблоны JavaScript в функции, которые можно оценить для рендеринга. [...] Аргумент настройки должен быть хешем, содержащим любой _.templateSettings, который должен быть переопределен.

Вам нужно скомпилировать шаблон с помощью _.template, а затем выполнить возвращенную функцию, чтобы получить заполненный шаблон:

var tmpl = _.template(template_string);
var html = tmpl(data);

// or as a one-liner, note where all the parentheses are
var html = _.template(template_string)(data);

В вашем случае это выглядит примерно так:

var V = Backbone.View.extend({
  el:'body',
  render: function () {
    var data = { lat: -27, lon: 153 };
    var tmpl = _.template('<%= lat %> <%= lon %>');
    this.$el.html(tmpl(data));
    return this;
  }
});

var v = new V();

v.render();
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.0/backbone-min.js"></script>

Ответ 2

Это может быть полезно

1: Если у вас более одного шаблона или когда-нибудь вы используете внешний шаблон, чтобы он мог быть полезным для вас внутри метода, вы можете написать код многократного использования

var V = Backbone.View.extend({

    el:'body',

        temp: function (str) {

            // reusable code
            return _.template(str);
        },
        render: function () {
            var data = { lat: -27, lon: 153 };

            // calling your view method temp        
            var tmpl = this.temp('<%= lat %> <%= lon %>');

            this.$el.html(tmpl(data));

            return this;
        }
     });

    var v = new V();

    v.render();