RequireJS文本插件和变量连接字符串

时间:2013-01-07 09:53:20

标签: javascript requirejs amd

我正在使用RequireJS文本插件来加载一些html模板。 当我将字符串文字传递给require函数时,它工作正常。

var templateHTML = require('text!templates/template_name.html');

但是当我使用变量连接字符串

var templateName = 'template_name';
var templateHTML = require('text!templates/'+templateName+'.html');

它抛出以下错误:

Uncaught Error: Module name "text!templates/template_name.html" has not been loaded yet for context: _

有关此问题的任何想法吗?

更新:这是我的测试代码。

require.config({
    paths: {
       text: '../lib/text',
    }
});

define(function (require, exports, module) {
   "use strict";
    require(['text'], function (text) {

       //var templateHTML = require('text!templates/template_name.html');

       var templateName = 'template_name';
       var templateHTML = require('text!templates/'+templateName+'.html');


    });
});

RequireJS text version:2.0.3
RequireJS版本:2.1.1

4 个答案:

答案 0 :(得分:1)

定义数组中的路径以确保在使用它之前加载它

var templateName = 'template_name';
require(['text!templates/'+templateName+'.html'], templateHTML);

//now you can use  
this.template =  _.template(templateHTML, {});

答案 1 :(得分:0)

你试过这种方式吗?

require.config({
  paths: {
    text: '../lib/text',
  }
});

define(function (require, exports, module) {
  "use strict";
   var templateName = 'template_name';

   require(['text!templates/' + templateName + '.html'], function (template) {
      console.log('loaded template: ', template);
   });
});

只是一个想法,告诉我它是怎么回事。

答案 2 :(得分:0)

内部依赖项扫描仅适用于字符串文字依赖项。您应该查看 require.js 来源,并尝试查找 cjsRequireRegExp 变量。 如前所述,您可以使用回调表示法加载内容。

cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g

答案 3 :(得分:0)

我在尝试使用Backbone / Marionette时遇到了这个问题。感谢@Ignacio和@Stanislau Tsishkou以上的见解。

我能够使用数组+回调方法解决它:

var templateName = 'template_name';
var templateHTML = require('text!templates/'+templateName+'.html', function (templateHTML) {
  templateHTML = template;
);

// ...

var View = Backbone.Marionette.ItemView.extend({
  // ...

  template: function() { 
    return Handlebars.compile(templateHTML).apply(null, arguments); 
  },

  // ...
});

重要的部分是:

  1. 确保您将在回调中返回的结果templateHTML设置为可在适当范围内访问的变量(templateHTML =模板实现此目的)。
  2. 如果使用Marionette,请确保使用函数生成模板,因为在实际需要之前,不会尝试渲染templateHTML。
  3. 如果使用把手,就像我在这个例子中一样,请务必使用apply方法,因为我必须传递模板函数中使用的任何参数,因为Handlebars.compile()返回一个函数,而不是编译模板文字。
  4. 如果您没有使用Handlebars,只使用Underscore或Lodash,那么牵线木偶文档会给出一个很好的例子 - http://marionettejs.com/docs/v2.4.2/marionette.itemview.html#itemview-render

    template : function(serialized_model) {
      var name = serialized_model.name;
      return _.template(templateHTML)({
        name : name
      });
    }