2

(这个问题与这个有关,但现在我已经转移到grunt-ember-templates而不是grunt-contrib-handlebars

我正在尝试将我的 ember.js 车把模板拆分为多个文件,以使代码库更易于管理。我正在使用grunt-ember-templates,配置如下:

ember_templates: {
    compile: {
        options: {
            templateName: function(sourceFile) {
                return sourceFile.replace(/app\/templates\//, ''); // <%= yeoman.dist %>/scripts/
            }
        },
        files: {
            '<%= yeoman.dist %>/scripts/templates.js': [
                '<%= yeoman.app %>/templates/**/*.hbs'
            ]
        }
    }
}

这会dist/scripts/templates.js按预期创建一个,我的客户正在愉快地加载它。templates.js看起来像这样:

Ember.TEMPLATES["accounts"] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {
    ...

这对我来说很好:模板保存在Ember.TEMPLATES数组中,带有预期的键。甚至还有一个application键,在生成的templates.js文件下方:

Ember.TEMPLATES["application"] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) {

来自templates/application.hbs

<section class="toolbar">
</section>
<section class="main_section">
  <nav>
      ...
  </nav>

  {{ outlet }}

</section>

<div class="modal small hide fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-header">
      ...
</div>

不过,我在templates.js加载时收到此错误(实际上是嵌入其中scripts.js,请参见下面我的index.html):

Uncaught Error: assertion failed: You specified the templateName application for <App.ApplicationView:ember312>, but it did not exist.

这个严重错误是什么意思,我该如何摆脱它?

这是我的Ember Application

this.App = Ember.Application.create({
    LOG_TRANSITIONS: true,
    VERSION: '1.0.0',
    ready: function () {
        console.log('App version: ' + App.VERSION + ' is ready.');
    }
});

这是我的ApplicationView

App.ApplicationView = Ember.View.extend({
    templateName: 'application'
});

这是我的index.html

<!DOCTYPE html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
  <head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <title></title>
    <meta name="description" content=""/>
    <meta name="viewport" content="width=device-width"/>

    <!-- build:css styles/main.css -->
    <link rel="stylesheet" href="styles/bootstrap.min.css"/>
    <link rel="stylesheet" href="styles/css/font-awesome.min.css"/>
    <link rel="stylesheet" href="styles/font-styles.css"/>
    <link rel="stylesheet" href="styles/main.css"/>
    <!-- endbuild -->

  </head>
  <body>

    <!--[if lt IE 7]>
        <p class="chromeframe">You are using an outdated browser. <a href="http://browsehappy.com/">Upgrade your browser today</a> or <a href="http://www.google.com/chromeframe/?redirect=true">install Google Chrome Frame</a> to better experience this site.</p>
    <![endif]-->

    <!-- Add your site or application content here -->

    <!-- My templates used to be here, but now they are in templates.js -->

      <div class="pagination">
          <ul>
              <li><a href="#">Prev</a></li>
              <li><a href="#">1</a></li>
              <li><a href="#">2</a></li>
              <li><a href="#">3</a></li>
              <li><a href="#">4</a></li>
              <li><a href="#">Next</a></li>
          </ul>
      </div>
    </script>

    <!-- build:js scripts/scripts.js -->
    <script src="scripts/vendor/jquery-1.9.1.js"></script>
    <script src="scripts/vendor/handlebars.1.0.rc.3.js"></script>
    <script src="scripts/vendor/ember-1.0.0-rc.2.js"></script>
    <script src="scripts/vendor/ember-data.js"></script>
    <script src="scripts/vendor/bootstrap.min.js"></script>
    <script src="scripts/templates.js"></script>
    <script src="scripts/main.js"></script>
    <!-- endbuild -->

  </body>
</html>
4

2 回答 2

2

作为记录:我的问题是通过更改加载 javascript 文件的顺序解决的。

templates.js必须在加载ember后加载

我以为 ember 需要在加载之前定义模板,但这实际上是完全错误的:由于模板存储在.ember 中Ember.TEMPLATES,因此必须在模板之前加载 ember 。然后可以加载模板,然后可以创建应用程序。

我之前没有发现这个bug的原因是ember在控制台中根本没有抱怨。

于 2013-04-10T08:31:40.840 回答
1

我一直在使用template:而不是templateName:,它似乎工作正常:

template: Ember.TEMPLATES['application']

可能有更好的方法来做到这一点。但这至少会让你摆脱困境。

于 2013-04-09T10:54:38.663 回答