Скелет не загружает 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 не определен.
Ниже, что я сделал, чтобы это заработало:
В моем конфиге / requirejs.yml я сидел:
modules: - name: "products/product_price_tmpl"
На мой взгляд определение:
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)) @
Все мои шаблоны находятся в каталоге 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({...})
Надеюсь, что это поможет другим.