我正在使用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
答案 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);
},
// ...
});
重要的部分是:
如果您没有使用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
});
}