2013-11-07 12 views
14

Я создаю проект Backbone с Handlebars, и у меня возникла проблема с Handlebars, не находя метод компиляции. Вот мой конфигурационный файл:Почему у моих ручек нет метода компиляции?

require.config({ 
    hbs: { 
    templateExtension: '.hbs' 
    }, 
    paths: { 
    backbone: "libs/backbone/backbone", 
    handlebars: 'libs/handlebars/handlebars.amd', 
    hbs: 'libs/requirejs-hbs/hbs', 
    jquery: 'libs/jquery/jquery', 
    jqueryMockAjax: 'libs/jquery-mockjax/jquery.mockjax', 
    text: 'libs/requirejs-text/text', 
    templates: 'templates/', 
    underscore: 'libs/underscore/underscore' 
    }, 
    shim: { 
    backbone: { 
     deps: [ 
     'underscore', 
     'jquery' 
     ], 
     exports: 'Backbone' 
    }, 
    hbs: { 
     deps: ['handlebars'], 
     exports: 'hbs' 
    }, 
    jqueryMockAjax: { 
     deps: [ 'jquery' ], 
     exports: '$.mockjax' 
    }, 
    underscore: { 
     exports: '_' 
    } 
    } 
}); 

require(['app'], function(App) { 
    'use strict'; 

    var app = new App(); 
    app.render(); 
}); 

Вот app.js, что я пытаюсь сделать:

define(function(require) { 

    var Backbone = require('backbone'); 
    var testTemplate = require('hbs!templates/test'); 

    var router = Backbone.View.extend({ 
    el: $('body'), 
    template: testTemplate, 
    render: function() { 
     return $(this.el).html(this.template()); 
    } 
    }); 

    return router; 
}); 

Когда Handlebars вызывает hbs.js файл на линии 25 не может найти compile функцию

define(["handlebars"], function(Handlebars) { 
    var buildMap = {}, 
     templateExtension = ".hbs"; 

    return { 

    // http://requirejs.org/docs/plugins.html#apiload 
    load: function (name, parentRequire, onload, config) { 

     // Get the template extension. 
     var ext = (config.hbs && config.hbs.templateExtension ? config.hbs.templateExtension : templateExtension); 

     if (config.isBuild) { 
     // Use node.js file system module to load the template. 
     // Sorry, no Rhino support. 
     var fs = nodeRequire("fs"); 
     var fsPath = config.dirBaseUrl + "/" + name + ext; 
     buildMap[name] = fs.readFileSync(fsPath).toString(); 
     onload(); 
     } else { 
     // In browsers use the text-plugin to the load template. This way we 
     // don't have to deal with ajax stuff 
     parentRequire(["text!" + name + ext], function(raw) { 
      // Just return the compiled template 
****HERE onload(Handlebars.compile(raw)); 
     }); 
     } 

    }, 

    // http://requirejs.org/docs/plugins.html#apiwrite 
    write: function (pluginName, name, write) { 
     var compiled = Handlebars.precompile(buildMap[name]); 
     // Write out precompiled version of the template function as AMD 
     // definition. 
     write(
     "define('hbs!" + name + "', ['handlebars'], function(Handlebars){ \n" + 
      "return Handlebars.template(" + compiled.toString() + ");\n" + 
     "});\n" 
    ); 
    } 

    }; 
}); 

Переменная Handlebars дает мне среду Handlebars, но в ней есть дополнительный слой, поэтому я должны изменить эту строку на Handlebars.default.compile(raw). Где находится этот объект default, и откуда я могу избавиться от него? Я бы не стал беспокоиться об этом, но если я сдержу этот проект где-то еще, мне всегда придется помнить об этом.

+0

Какая версия вы используете? Проверьте [здесь] (http://handlebarsjs.com/) и загрузите последнюю версию '1.1.2'. – James

+0

Я использую версию '1.1.2'. Все мои зависимости были задействованы 'bower' и получили« последние ». – jhamm

+0

Вы когда-нибудь это выясняли? У меня такая же проблема сейчас – mike

ответ

-2

Вот как я исправил эту проблему, хотя я не совсем понимаю, почему конфигурация выше не работает. Плагин hbs имел папку со всеми зависимостями, в которых она нуждалась, например handlebars. Когда я ссылался на копию handlebars, содержащуюся в каталоге hbs, все работает так, как предполагалось. Я не понимаю, почему ванильная копия handlebars не работала. Я не использовал runtime handlebars, это была полная версия, но все еще была проблема. После того, как я решил это, мои шаблоны просто работали.

60

Я просто столкнулся с этим сам, используя Handlebars для этого первого раза. Вероятно, вы используете сборку Handlebars «runtime». Я включил это в свои требования, ошибочно полагая, что это была мини-версия или что-то в этом роде.

Но на самом деле версия исполнения значительно меньше, поскольку она исключает шаблонный компилятор и предназначена для использования только с предварительно скомпилированными шаблонами. Если вы компилируете клиентскую копию шаблона, то вам нужна полная версия от http://builds.handlebarsjs.com.s3.amazonaws.com/handlebars-v3.0.3.js (Примечание: эта ссылка может быть устаревшей, вам, вероятно, лучше перейти непосредственно на handlebarsjs.com и найти текущую загрузку для " полная версия ", в отличие от времени выполнения.)

В противном случае вы можете выполнить инструкции на веб-сайте Handlebars для запуска компилятора шаблона. Для этого вам нужен узел. Компилятор шаблона создает файл JavaScript, содержащий предварительно скомпилированный шаблонный код, который вам нужно связать с вашей страницей вместе со сборкой времени выполнения Handlebars.

+0

16 upvotes (просто наткнулся на это сам). Возможно, они должны рассмотреть более информативный комментарий по ссылке на своем сайте. –

+3

В качестве продолжения этого следует отметить, что моя ссылка на полную версию Handlebars, безусловно, устарела; посетите веб-сайт Handlebars, чтобы найти последнюю версию. – Iguananaut

Смежные вопросы