Скелет не загружает JST

У меня есть приложение, которое использует Backbone.js. Все работало нормально, но недавно я добавил RequireJS в свой проект, и это, конечно, заставило все сломаться, поэтому я нахожусь в процессе определения моих зависимостей и обеспечения того, чтобы все работало снова.

Я получаю ошибку Uncaught ReferenceError: JST is not defined.

У меня есть следующий файл представления CoffeeScript. Обратите внимание на строку JST:

define ["app"], (App) ->
  Snip.Views.Appointments ||= {}

  class Snip.Views.Appointments.IndexView extends Backbone.View
    template: JST["backbone/templates/appointments/index"]

    initialize: () ->
      @options.appointments.bind('reset', @addAll)

    addAll: () =>
      @options.appointments.each(@addOne)

    addOne: (appointment) =>
      view = new Snip.Views.Appointments.AppointmentView({model : appointment})
      @$("ul").append(view.render().el)

Моя зависимость "app" сама имеет зависимости Backbone и Underscore, поэтому я не думаю, что проблема в том, что Backbone отсутствует:

define ["underscore", "backbone"], (_, Backbone) ->
  window.Snip =
    Models: {}
    Collections: {}
    Routers: {}
    Views: {}

Когда я загружаю страницу, я получаю Uncaught ReferenceError: JST is not defined,

Что мне нужно сделать, чтобы мой скрипт узнал о JST?

Редактировать: вот мои пути и прочее

require
  paths:
    jquery: "jquery-1.7.2.min"
    underscore: "lodash.min"
    appointment: "backbone/models/appointment"
    appointmentIndexView: "backbone/views/appointments/index_view"
    appointmentsRouter: "backbone/routers/appointments_router"
    relational: "backbone-relational"
  shim:
    "underscore":
      exports: "_"
    "backbone":
      deps: ["underscore", "jquery"]
      exports: "Backbone"
    "relational":
      deps: ["backbone"]

requirejs ["appointmentsRouter"], (AppointmentsRouter) ->
  window.router = new Snip.Routers.AppointmentsRouter({appointments: []})
  Backbone.history.start()

5 ответов

У меня была похожая проблема. Я получил ошибку в моем Backbone View:

Uncaught ReferenceError: JST не определен.

Ниже, что я сделал, чтобы это заработало:

  1. В моем конфиге / requirejs.yml я сидел:

    modules:
        - name: "products/product_price_tmpl"
    
  2. На мой взгляд определение:

    define ['jquery', 'underscore', 'backbone', 'products/product_price_tmpl'] , ($, _, Backbone) ->
    
    Backbone.View.extend
    
        template: JST['products/product_price_tmpl']
    
        tagName: 'li'
    
        render: ->
            @$el.html(@template(@model.attributes))
            @
    
  3. Все мои шаблоны находятся в каталоге assets / templates. Если у requirejs есть проблема с поиском вашего шаблона в этом каталоге, вы можете переместить каталог шаблонов в папку assets/javascripts или добавить эту строку в файл config/application.rb:

    config.assets.paths << "#{Rails.root}/app/assets/templates"  
    

Нет переменной с именем JST доступно, когда модуль загружен.

Вам нужно добавить путь к вашей JST -библиотеке в paths-атрибут в require.config,

Тогда, скорее всего, вам нужно будет добавить его в shim также и сделать его экспорт JST,

В require.js ваши сигналы тревоги должны начать звонить, когда вы используете какой-то внешний ресурс внутри модуля, который не был

А. Импортировано в define -раздел этого модуля

B. импортируется через require внутри этого модуля

C. Упоминается в вашем require.config -функции

ОБНОВИТЬ

Вам нужно создать новый модуль (например, templates.js), который возвращает переменную (например, JST).

define([
  ...
], function( ... ) {

  var JST = {};

  JST['template/name'] = "<div class='my-template'><%= my-content %></div>";

  ...

  return JST;
}

Затем в модуле вы хотите использовать эти шаблоны в:

define([
  ...
  'path/to/your/JST/module',
  ...
], function(..., JST, ...) {

// Et voilà, now you can use the templates like they should be used

});

Я использую Backbone Boilerplate, который компилирует шаблоны в один файл с именем templates.js. JST определяется в templates.js. настроить пути с помощью templates.js, чтобы решить проблему.

Укажите правильный порядок загрузки

require.config

require.config({
    paths: {

        // specify templates
        templates: 'compiled-templates'
    }
})

// firstly load templates
require(['templates'], function() {

    // then load you app
    require(['core/Core']);
});

Пока Jason Swett использовал AMD/require.js, поскольку название вопроса не является конкретным, я подумал, что отвечу от имени пользователей CommonJS/Browserify, так как я оказался здесь после поиска в Google той же проблемы.

После переноса моего приложения Backbone в Browserify получал "JST в неопределенной ошибке". wawka выше помог мне разобраться.

Прежде чем я имел:

JST["path/to/template"]({...});

Теперь у меня есть:

var template = require("path/to/template");
...
template({...})

Надеюсь, что это поможет другим.

Другие вопросы по тегам