1

我有一个使用 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)

我的“应用程序”依赖项本身具有 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()
4

5 回答 5

1

我有类似的问题。我的主干视图出现错误:

未捕获的 ReferenceError:未定义 JST。

下面是我为使其工作所做的工作:

  1. 在我的 config/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"  
    
于 2013-03-19T20:04:45.177 回答
1

JST加载相关模块时,没有可用的变量调用。

您需要将 JST -library 的路径添加到paths-attribute in 中require.config

然后很可能您需要将其添加到shimalso 并使其 export JST

在 require.js 中,当你在模块中使用一些外部资源时,你的警钟应该开始响起。

A. 在该define模块的 - 部分中导入

B. 通过require该模块内部导入

C. 在你的require.config-function中提到

更新

您需要创建一个新模块(如 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

});
于 2012-08-15T13:53:05.460 回答
0

虽然Jason Swett使用的是 AMD/require.js,但由于问题标题并不具体,我想我会代表 CommonJS/Browserify 用户回答,因为我在谷歌搜索同一问题后最终来到了这里。

将我的 Backbone 应用程序移动到 Browserify 后,出现“未定义错误中的 JST”。wawka上面的回答帮助我把事情整理好。

在我有之前:

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

我现在有:

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

希望这对其他人有帮助。

于 2014-11-03T13:59:09.903 回答
0

我正在使用 Backbone Boilerplate,它将模板编译成一个名为 templates.js 的文件。JST 在 templates.js 中定义。使用 templates.js 配置路径解决了这个问题。

于 2012-08-15T23:01:21.317 回答
0

指定正确的加载顺序

需要配置

require.config({
    paths: {

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

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

    // then load you app
    require(['core/Core']);
});
于 2015-11-19T16:45:19.040 回答