2014-03-26 31 views
0

我是ember.js的新手。我設法使用Grunt文件預編譯模板。但是,當我將它們包含在index.html中時,我看到一個空白頁面,模板未呈現。我究竟做錯了什麼?如果我不編譯模板並直接包含在index.html中,它就可以工作。Ember.js:如何在index.html中正確包含編譯模板?

我使用yeoman.io(使用涼亭包咕嚕-燼模板,燼,webapp的腳手架)安裝了一切

我的index.html:

<!doctype html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <title>My New App</title> 
    <meta name="description" content=""> 
    <meta name="viewport" content="width=device-width"> 
    <link rel="shortcut icon" href="/favicon.ico"> 
    <link rel="stylesheet" href="css/style.css"> 
</head> 
<body> 

    <script src="bower_components/jquery/dist/jquery.js"></script> 
    <script src="bower_components/handlebars/handlebars.js"></script>  
    <script src="bower_components/ember/ember.js"></script> 
    <script src="scripts/templates.js"></script> 
    <script src="scripts/app.js"></script> 
</body> 
</html> 

我App.js:

App = Ember.Application.create(); 

    App.Router.map(function() { 
     // put your routes here 
    }); 

    App.IndexRoute = Ember.Route.extend({ 
     model: function() { 
     return ['red', 'yellow', 'blue']; 
     } 
    }); 

模板:

編輯:application.hbs

<h2>Welcome to Ember.js</h2> 

    {{outlet}} 

編輯:index.hbs

<ul> 
    {{#each item in model}} 
     <li>{{item}}</li> 
    {{/each}} 
    </ul> 

編譯模板templates.js:

define(["ember"], function(Ember){ 

Ember.TEMPLATES["application"] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) { 
this.compilerInfo = [4,'>= 1.0.0']; 
helpers = this.merge(helpers, Ember.Handlebars.helpers); data = data || {}; 
    var buffer = '', stack1; 


    data.buffer.push("<h2>Welcome to Ember.js</h2>\n\n"); 
    stack1 = helpers._triageMustache.call(depth0, "outlet", {hash:{},hashTypes:{},hashContexts:{},contexts:[depth0],types:["ID"],data:data}); 
    if(stack1 || stack1 === 0) { data.buffer.push(stack1); } 
    return buffer; 

}); 

Ember.TEMPLATES["index"] = Ember.Handlebars.template(function anonymous(Handlebars,depth0,helpers,partials,data) { 
this.compilerInfo = [4,'>= 1.0.0']; 
helpers = this.merge(helpers, Ember.Handlebars.helpers); data = data || {}; 
    var buffer = '', stack1, self=this; 

function program1(depth0,data) { 

    var buffer = '', stack1; 
    data.buffer.push("\n <li>"); 
    stack1 = helpers._triageMustache.call(depth0, "item", {hash:{},hashTypes:{},hashContexts:{},contexts:[depth0],types:["ID"],data:data}); 
    if(stack1 || stack1 === 0) { data.buffer.push(stack1); } 
    data.buffer.push("</li>\n "); 
    return buffer; 
    } 

    data.buffer.push("\n<ul>\n "); 
    stack1 = helpers.each.call(depth0, "item", "in", "model", {hash:{},hashTypes:{},hashContexts:{},inverse:self.noop,fn:self.program(1, program1, data),contexts:[depth0,depth0,depth0],types:["ID","ID","ID"],data:data}); 
    if(stack1 || stack1 === 0) { data.buffer.push(stack1); } 
    data.buffer.push("\n</ul>\n"); 
    return buffer; 

}); 

}); 

回答

1

你沒有具體的關於你如何編譯你的模板。它們來自* .hbs文件,還是您使用不同的方法?

在我看來,你正試圖編譯templates.html文件作爲一個模板,因爲它在模板本身這個代碼:

data.buffer.push("\n<script type=\"text/x-handlebars\">\n 

每個模板文件應該只包含模板的內容,而不是腳本標籤本身。

通常情況下,您會將每個.hbs文件放在一個單獨的文件中,並與用於確定模板名稱的文件一起使用。

我之前做過一個演示文稿,我正在使用grunt對應用程序進行實時編碼。該屏幕錄像確實展示瞭如何組織您的.hbs文件,而源代碼顯示了它們是如何編寫的。這顯示了我的開發過程,並且通過構建一個完整的應用程序,並使用grunt作爲構建系統。

這次報告會是在YouTube上:https://www.youtube.com/watch?v=KH5RreHtaaQ 的源代碼是在GitHub上:https://github.com/joachimhs/WarmCroc-Ember

希望幫助!

+0

是的,他們都來自一個index.hbs文件,腳本標記沒有被省略。我相信你的意思是文件名被用作模板名稱?所以我從模板中刪除了

0

我通過從grunt-ember-templates grunt配置中刪除amd:true選項來解決問題。說實話,我已經添加它不知道它是什麼。

爲了完整性,這裏是我目前的grunt文件。這個文件由yeoman.io webapp生成器自動生成,並且我只爲它添加了一個grunt-ember-templates配置(在emberTemplates下定義的配置)。

從今天起,我在網上找到的所有指南都是不完整的或過時的,這對我很有用。

// Generated on 2014-03-24 using generator-webapp 0.4.8 
'use strict'; 

// # Globbing 
// for performance reasons we're only matching one level down: 
// 'test/spec/{,*/}*.js' 
// use this if you want to recursively match all subfolders: 
// 'test/spec/**/*.js' 

module.exports = function (grunt) { 

    // Load grunt tasks automatically 
    require('load-grunt-tasks')(grunt); 

    // Time how long tasks take. Can help when optimizing build times 
    require('time-grunt')(grunt); 

    grunt.loadNpmTasks('grunt-ember-templates'); 
    // Define the configuration for all the tasks 
    grunt.initConfig({ 

     // Project settings 
     config: { 
      // Configurable paths 
      app: 'app', 
      dist: 'dist' 
     }, 

     emberTemplates: { 
      compile: { 
       options: { 

        templateBasePath: /app\/templates\// 
       //templateName: function(sourceFile) { 
       //  console.log(sourceFile.replace(/app\/templates\//, '')); 
       //  return sourceFile.replace(/app\/templates\//, ''); 
       // } 
       }, 
       files: { 
        '<%= config.app %>/scripts/templates.js': ['<%= config.app %>/templates/*.hbs'] 
       } 
      } 
     }, 
     // Watches files for changes and runs tasks based on the changed files 
     watch: { 
      emberTemplates: { 
       files: '<%= config.app %>/templates/*.hbs', 
       tasks: ['emberTemplates', 'livereload'] 
      }, 
      bower: { 
       files: ['bower.json'], 
       tasks: ['bowerInstall'] 
      }, 
      js: { 
       files: ['<%= config.app %>/scripts/{,*/}*.js'], 
       tasks: ['jshint'], 
       options: { 
        livereload: true 
       } 
      }, 
      jstest: { 
       files: ['test/spec/{,*/}*.js'], 
       tasks: ['test:watch'] 
      }, 
      gruntfile: { 
       files: ['Gruntfile.js'] 
      }, 
      styles: { 
       files: ['<%= config.app %>/styles/{,*/}*.css'], 
       tasks: ['newer:copy:styles', 'autoprefixer'] 
      }, 
      livereload: { 
       options: { 
        livereload: '<%= connect.options.livereload %>' 
       }, 
       files: [ 
        '<%= config.app %>/{,*/}*.html', 
        '.tmp/styles/{,*/}*.css', 
        '<%= config.app %>/images/{,*/}*' 
       ] 
      } 
     }, 

     // The actual grunt server settings 
     connect: { 
      options: { 
       port: 9000, 
       livereload: 35729, 
       // Change this to '0.0.0.0' to access the server from outside 
       hostname: 'localhost' 
      }, 
      livereload: { 
       options: { 
        open: true, 
        base: [ 
         '.tmp', 
         '<%= config.app %>' 
        ] 
       } 
      }, 
      test: { 
       options: { 
        port: 9001, 
        base: [ 
         '.tmp', 
         'test', 
         '<%= config.app %>' 
        ] 
       } 
      }, 
      dist: { 
       options: { 
        open: true, 
        base: '<%= config.dist %>', 
        livereload: false 
       } 
      } 
     }, 

     // Empties folders to start fresh 
     clean: { 
      dist: { 
       files: [{ 
        dot: true, 
        src: [ 
         '.tmp', 
         '<%= config.dist %>/*', 
         '!<%= config.dist %>/.git*' 
        ] 
       }] 
      }, 
      server: '.tmp' 
     }, 

     // Make sure code styles are up to par and there are no obvious mistakes 
     jshint: { 
      options: { 
       jshintrc: '.jshintrc', 
       reporter: require('jshint-stylish') 
      }, 
      all: [ 
       'Gruntfile.js', 
       '<%= config.app %>/scripts/{,*/}*.js', 
       '!<%= config.app %>/scripts/vendor/*', 
       'test/spec/{,*/}*.js' 
      ] 
     }, 

     // Mocha testing framework configuration options 
     mocha: { 
      all: { 
       options: { 
        run: true, 
        urls: ['http://<%= connect.test.options.hostname %>:<%= connect.test.options.port %>/index.html'] 
       } 
      } 
     }, 

     // Add vendor prefixed styles 
     autoprefixer: { 
      options: { 
       browsers: ['last 1 version'] 
      }, 
      dist: { 
       files: [{ 
        expand: true, 
        cwd: '.tmp/styles/', 
        src: '{,*/}*.css', 
        dest: '.tmp/styles/' 
       }] 
      } 
     }, 

     // Automatically inject Bower components into the HTML file 
     bowerInstall: { 
      app: { 
       src: ['<%= config.app %>/index.html'], 
       ignorePath: '<%= config.app %>/' 
      } 
     }, 

     // Renames files for browser caching purposes 
     rev: { 
      dist: { 
       files: { 
        src: [ 
         '<%= config.dist %>/scripts/{,*/}*.js', 
         '<%= config.dist %>/styles/{,*/}*.css', 
         '<%= config.dist %>/images/{,*/}*.*', 
         '<%= config.dist %>/styles/fonts/{,*/}*.*', 
         '<%= config.dist %>/*.{ico,png}' 
        ] 
       } 
      } 
     }, 

     // Reads HTML for usemin blocks to enable smart builds that automatically 
     // concat, minify and revision files. Creates configurations in memory so 
     // additional tasks can operate on them 
     useminPrepare: { 
      options: { 
       dest: '<%= config.dist %>' 
      }, 
      html: '<%= config.app %>/index.html' 
     }, 

     // Performs rewrites based on rev and the useminPrepare configuration 
     usemin: { 
      options: { 
       assetsDirs: ['<%= config.dist %>', '<%= config.dist %>/images'] 
      }, 
      html: ['<%= config.dist %>/{,*/}*.html'], 
      css: ['<%= config.dist %>/styles/{,*/}*.css'] 
     }, 

     // The following *-min tasks produce minified files in the dist folder 
     imagemin: { 
      dist: { 
       files: [{ 
        expand: true, 
        cwd: '<%= config.app %>/images', 
        src: '{,*/}*.{gif,jpeg,jpg,png}', 
        dest: '<%= config.dist %>/images' 
       }] 
      } 
     }, 

     svgmin: { 
      dist: { 
       files: [{ 
        expand: true, 
        cwd: '<%= config.app %>/images', 
        src: '{,*/}*.svg', 
        dest: '<%= config.dist %>/images' 
       }] 
      } 
     }, 

     htmlmin: { 
      dist: { 
       options: { 
        collapseBooleanAttributes: true, 
        collapseWhitespace: true, 
        removeAttributeQuotes: true, 
        removeCommentsFromCDATA: true, 
        removeEmptyAttributes: true, 
        removeOptionalTags: true, 
        removeRedundantAttributes: true, 
        useShortDoctype: true 
       }, 
       files: [{ 
        expand: true, 
        cwd: '<%= config.dist %>', 
        src: '{,*/}*.html', 
        dest: '<%= config.dist %>' 
       }] 
      } 
     }, 

     // By default, your `index.html`'s <!-- Usemin block --> will take care of 
     // minification. These next options are pre-configured if you do not wish 
     // to use the Usemin blocks. 
     // cssmin: { 
     //  dist: { 
     //   files: { 
     //    '<%= config.dist %>/styles/main.css': [ 
     //     '.tmp/styles/{,*/}*.css', 
     //     '<%= config.app %>/styles/{,*/}*.css' 
     //    ] 
     //   } 
     //  } 
     // }, 
     // uglify: { 
     //  dist: { 
     //   files: { 
     //    '<%= config.dist %>/scripts/scripts.js': [ 
     //     '<%= config.dist %>/scripts/scripts.js' 
     //    ] 
     //   } 
     //  } 
     // }, 
     // concat: { 
     //  dist: {} 
     // }, 

     // Copies remaining files to places other tasks can use 
     copy: { 
      dist: { 
       files: [{ 
        expand: true, 
        dot: true, 
        cwd: '<%= config.app %>', 
        dest: '<%= config.dist %>', 
        src: [ 
         '*.{ico,png,txt}', 
         '.htaccess', 
         'images/{,*/}*.webp', 
         '{,*/}*.html', 
         'styles/fonts/{,*/}*.*' 
        ] 
       }] 
      }, 
      styles: { 
       expand: true, 
       dot: true, 
       cwd: '<%= config.app %>/styles', 
       dest: '.tmp/styles/', 
       src: '{,*/}*.css' 
      } 
     }, 

     // Run some tasks in parallel to speed up build process 
     concurrent: { 
      server: [ 
       'copy:styles' 
      ], 
      test: [ 
       'copy:styles' 
      ], 
      dist: [ 
       'copy:styles', 
       'imagemin', 
       'svgmin' 
      ] 
     } 
    }); 


    grunt.registerTask('serve', function (target) { 
     if (target === 'dist') { 
      return grunt.task.run(['build', 'connect:dist:keepalive']); 
     } 

     grunt.task.run([ 
      'clean:server', 
      'concurrent:server', 
      'autoprefixer', 
      'connect:livereload', 
      'watch' 
     ]); 
    }); 

    grunt.registerTask('server', function (target) { 
     grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); 
     grunt.task.run([target ? ('serve:' + target) : 'serve']); 
    }); 

    grunt.registerTask('test', function (target) { 
     if (target !== 'watch') { 
      grunt.task.run([ 
       'clean:server', 
       'concurrent:test', 
       'autoprefixer' 
      ]); 
     } 

     grunt.task.run([ 
      'connect:test', 
      'mocha' 
     ]); 
    }); 

    grunt.registerTask('build', [ 
     'clean:dist', 
     'useminPrepare', 
     'concurrent:dist', 
     'autoprefixer', 
     'concat', 
     'cssmin', 
     'uglify', 
     'copy:dist', 
     'rev', 
     'usemin', 
     'htmlmin' 
    ]); 

    grunt.registerTask('default', [ 
     'newer:jshint', 
     'test', 
     'build' 
    ]); 
}; 
相關問題