Backbone.js requirejs文本插件下载所有不需要的模板
我使用RequireJS和文本插件在主干布局管理器中动态加载把手模板。但在页面加载时,下载的模板不是指定的模板,而是所有的模板。 在如下所示的情况下,当我只想呈现footer时,将获取所有文件(Backbone.js requirejs文本插件下载所有不需要的模板,backbone.js,requirejs,handlebars.js,Backbone.js,Requirejs,Handlebars.js,我使用RequireJS和文本插件在主干布局管理器中动态加载把手模板。但在页面加载时,下载的模板不是指定的模板,而是所有的模板。 在如下所示的情况下,当我只想呈现footer时,将获取所有文件(header,modal),而不仅仅是footer.tpl) templateLoader.js define(function (require) { var Handlebars = require('handlebars'); var getTemplateFile = funct
header
,modal
),而不仅仅是footer.tpl
)
templateLoader.js
define(function (require) {
var Handlebars = require('handlebars');
var getTemplateFile = function (templateName) {
var tmpl = null;
switch (templateName) {
case 'header':
tmpl = require('text!../html/templates/header.tpl');
break;
case 'footer':
tmpl = require('text!../html/templates/footer.tpl');
break;
case 'modal':
tmpl = require('text!../html/templates/modal.tpl');
break;
}
return tmpl;
};
var _compiled = function (tpl, context) {
var compiled = Handlebars.compile(tpl);
return context ? compiled(context) : compiled;
};
return {
getTemplate: function (templateName, model) {
return _compiled(getTemplateFile(templateName), model);
}
}
});
MyView.js-LayoutManager
App.Views.StoreFooter = Backbone.Layout.extend({
beforeRender: function () {
this.$el.html(Templates.getTemplate('footer'));
}
});
当我检查在Chrome中下载的资源时,我看到
modal.tpl
,header.tpl
,根据上述代码,它不应该在那里。这是语法sugar的副作用,如以下所述:
AMD加载程序将使用Function.prototype.toString()解析require(“”)调用,然后在内部将上述define调用转换为以下内容:
由于它将函数体解析为字符串,因此无法看到
require
语句位于开关
内,该开关保证只匹配一个案例
编辑:
我认为这可以通过重构代码来解决:
var getTemplateFile = function (templateName) {
var path = null;
switch (templateName) {
case 'header':
path = 'text!../html/templates/header.tpl';
break;
case 'footer':
path = 'text!../html/templates/footer.tpl';
break;
case 'modal':
path = 'text!../html/templates/modal.tpl';
break;
}
return require(path);
};
不幸的是,这导致:
未捕获错误:尚未为上下文加载模块名“text!blah.txt_unnormalized2”:_
…当您意识到这只是语法上的甜点,而不是让RequireJS在同步模式下工作的方式时,这是有意义的。非常感谢您提供的信息。我该怎么做呢?我在遵循这里给出的一个例子。。
define(['require', 'dependency1', 'dependency2'], function (require) {
var dependency1 = require('dependency1'),
dependency2 = require('dependency2');
return function () {};
});
var getTemplateFile = function (templateName) {
var path = null;
switch (templateName) {
case 'header':
path = 'text!../html/templates/header.tpl';
break;
case 'footer':
path = 'text!../html/templates/footer.tpl';
break;
case 'modal':
path = 'text!../html/templates/modal.tpl';
break;
}
return require(path);
};