Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js requirejs文本插件下载所有不需要的模板_Backbone.js_Requirejs_Handlebars.js - Fatal编程技术网

Backbone.js requirejs文本插件下载所有不需要的模板

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

我使用RequireJS和文本插件在主干布局管理器中动态加载把手模板。但在页面加载时,下载的模板不是指定的模板,而是所有的模板。 在如下所示的情况下,当我只想呈现footer时,将获取所有文件(
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);
};