2013-05-14 108 views
3

我使用RequireJS文本插件一起装载车把骨干布局管理动态模板,不要求所有模板。但在页面加载时,所有模板都会下载而不是指定的模板。 在这种情况下如下图所示的时候我只是想呈现页脚所有(headermodal)被取出,而不是只footer.tpl文件。requirejs文本插件下载

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 - 布局管理

App.Views.StoreFooter = Backbone.Layout.extend({ 
    beforeRender: function() { 
     this.$el.html(Templates.getTemplate('footer')); 
    } 
}); 

当我检查在Chrome下载的资源,我看到modal.tplheader.tpl不应根据在那里以上代码。

回答

2

这是语法糖的副作用,在documentation描述:


define(function (require) { 
    var dependency1 = require('dependency1'), 
     dependency2 = require('dependency2'); 

    return function() {}; 
}); 

The AMD loader will parse out the require('') calls by using Function.prototype.toString(), then internally convert the above define call into this:

define(['require', 'dependency1', 'dependency2'], function (require) { 
    var dependency1 = require('dependency1'), 
     dependency2 = require('dependency2'); 

    return function() {}; 
}); 

由于它解析函数体作为字符串,它没有看到的是,require陈述里面的方式这是保证只匹配一个case

编辑:

我认为这可以通过重构你的代码位是固定的:

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); 
}; 

不幸的是,这会导致:

Uncaught Error: Module name "text!blah.txt_unnormalized2" has not been loaded yet for context: _

...这是有道理的当你意识到这只是语法糖,没有办法让RequireJS工作,我n同步模式。

+0

非常感谢您的信息。我该如何解决这个问题?我在这里之后给出一个例子.. https://github.com/efeminella/requirejs-template-module-example/blob/master/src/app/templates/Templates.js – user1184100 2013-05-14 18:52:53