【问题标题】:How to load an HTML template from a tpl.js file using Require.js如何使用 Require.js 从 tpl.js 文件加载 HTML 模板
【发布时间】:2015-03-12 20:26:01
【问题描述】:

首先我不确定 Backbone 是否是我应该使用的库,所以请注意这一点。

我正在构建一个由大约 17 个页面组成的静态内容网站。

您可能想知道的第一个问题是:如果网站上没有任何动态内容,为什么要使用 Backbone?

我必须回答的唯一好的答案是页面中仍然有一些可重复的元素,例如页脚,而有些元素可能仅在“标题”之类的内容上有所变化,就像页眉一样。所以我想在这方面实践 DRY 原则。

我也想学习 Backbone,所以对我来说,这是朝着正确方向迈出的一步,将它们全部放在我的脑海中。

我想使用把手进行模板化,但没有找到关于如何在我的 index.html 文件中调用模板 {{Footer}} 的好教程,而该模板是从其他 external.js 文件调用的。

换句话说,我希望我的模板位于单独的 .js 文件中,并且能够将它们调用到我的 index.html 文件中,但我找不到这样做的好方法。

任何建议都基于我的页脚示例,我想我可以从那里弄清楚。

谢谢。

更新:

这是我希望我的索引页理想的样子:

Index.html,我试图在其中拉出 MainView,其中包含 HeaderView 和 FooterView 作为其中的部分内容。

<body>

    <div id="container">
        <!-- BODY WRAPPER -->
        <section class="body-wrapper">

            <div class="header-container" id="home">
                <div class="header-nav-container">
                    {{> header}}
                </div>
            </div>


            <section class="home-content">
                {{> home-content}}
            </section>


            <section class="footer-container">
                {{> footer}}
            </section>

        </section>
        <!-- /.body-wrapper -->

    </div>
    <!-- /#container -->

    <script data-main="js/config" src="js/libs/require.js"></script>

</body>

HomeContentView:views/homeContentView.js

define(
  ['jquery','underscore','backbone' , 'text!/templates/main.tpl.html' 'text!/templates/home-content.tpl.html'],
  function($, _, Backbone, mainTemplate, homeContentTemplate){

    handlebars.registerPartial('home-content' , homeContentTemplate);

    var template = handlebars.compile()

    var HomeContentView = Backbone.View.extend({
      el      : $('#content'),
      render  : function() {
        this.$el.html(homeContentTemplate);
      }

    });

    return HomeView;
});

标题部分:views/headerView.js

define(
  ['jquery' , 'underscore' , 'backbone' , 'handlebars' , 'text!/templates/main.tpl.html' , 'text!/templates/header.tpl.html'],

  function($, _, Backbone, Handlebars, mainTemplate, headerTemplate){

    handlebars.registerPartial('header' , headerTemplate);

    var template = handlebars.compile()

   var HeaderView = Backbone.View.extend({
      el      : $('#header'),
      render  : function() {
        this.$el.append(headerTemplate);
      }

    });

    return HeaderView;
});

页脚视图:views/footerView.js

define(
  ['jquery','underscore','backbone' , 'text!/templates/main.tpl.html' , 'text!/templates/footer.tpl.html'],
  function($, _, Backbone, mainTemplate, footerTemplate){

    handlebars.registerPartial('footer' , footerTemplate);

    var template = handlebars.compile()

    var FooterView = Backbone.View.extend({
      el      : $('#footer'),

      render  : function() {
        this.$el.html(footerTemplate);
      }

    });

    return FooterView;
});

包含页眉和页脚部分的主视图:views/mainView.js

define(
  ['jquery','underscore','backbone' , 'index.html' 'text!/templates/main.tpl.html'],
  function($, _, Backbone, homeTemplate, mainTemplate){

    handlebars.registerPartial('main' , mainTemplate);

    var template = handlebars.compile()

    var MainView = Backbone.View.extend({
      el      : $('.home-content'),

      render  : function() {
        this.$el.html(mainTemplate);
      }

    });

    return MainView;
});

Router.js

define(

  ['jquery',
   'underscore',
   'backbone',
   'views/MainView'
   'views/HomeContentView',
   'views/HeaderView',
   'views/FooterView',
   'models/FeatureModel',
   'collections/FeatureCollection'],

  function($, _, Backbone, MainView, HomeConentView, HeaderView, FooterView, FeatureModel, FeatureCollection){

  var AppRouter = Backbone.Router.extend({
    routes: {
      ''                 : 'home', //#index
      '/feature/:page'   : 'featurePage',
      '*actions'         : 'defaultAction'
    }

  });

  var initialize = function(options) {

    var appView = options.appView;
    var router = new AppRouter(options);

    router.on('home', function(){

      var mainView = new MainView();
      mainView.render();
    });

    router.on('route:defaultAction', function(actions){

      var homeContentView = new HomeContentView();
      homeContentView.render();
    });

    router.on('support', function(){

      var supportView = new SupportView();
      supportView.render();
    });

    var headerView = new HeaderView();

    var footerView = new FooterView();

    Backbone.history.start();

  };
  return {
    initialize: initialize
  };

});

【问题讨论】:

    标签: backbone.js requirejs


    【解决方案1】:

    您可能希望使用 text plugin for require.js 将模板作为原始文本加载,并使用 Handlebars.registerPartial 方法存储模板并使其可用于其他模板作为部分。

    代码如下所示:

    define(['handlebars', 'text!main.tpl.html','text!footer.tpl.html'],
        function(handlebars, mainTpl, footerTpl ){
    
        // Register the footer's template as a partial.
        handlebars.registerPartial('footer', footerTpl);
    
        // Compile the main template. The footer is included.
        var template = handlebars.compile(mainTpl);
    
        // ... use the template ...
    });
    

    至于您的主模板,您只需要指定页脚模板的位置即可。

    <section>
        Something...
        {{> footer}}
    </section>
    

    (注意表示部分的“>”。)

    【讨论】:

    • 所以这是我的页脚代码,我将在哪里注册部分?是在我宣布观点之前吗?还是我在这里混淆了模式? define( ['jquery','underscore','backbone' , 'text!/templates/footer.tpl.html'], function($, _, Backbone, footerTemplate){ var FooterView = Backbone.View.extend({ el : $('#footer'), render : function() { this.$el.html(footerTemplate); } }); return FooterView; });
    • 另外,如果这应该在我的views/footer.js 文件中,为什么我还要调用我的“mainTpl”?这是否是说如果我也想创建一个标题模板,我也必须将它包含在其他更大的模板中?所以换句话说,最好创建一个主要的通用模板并将页眉和页脚作为部分调用到主模板中?那是否意味着我可以将内容区域创建为部分内容并将它们调用到主模板中?抱歉问了这么多问题。谢谢。
    • 另外我如何让 main.tpl.html 成为 index.html 页面?
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2013-09-18
    • 1970-01-01
    • 2013-01-21
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多