21

単純に、htmlファイルですべてのハンドルバーテンプレートを定義したくありません

私はこれを試しました

<script type="text/x-handlebars" data-template-name="nav-bar" src="template.handlebar"></script>

しかし、これはうまくいきませんでした。テンプレートをプログラムで定義したり、ハンドルバーファイルをロードして再利用したりすることはできません。また、それによって作業が少し保守しやすくなると感じています。

それらをajaxでロードしてヘッドに追加しようとしましたが、これは正常に機能します。ここで確認できますが、emberが既にロードされ、テンプレートが定義されていない場合、ember.jsはそれを読み取りません。

4

8 に答える 8

9

get でテンプレートをロードするように Ember View にパッチを適用することもできます

Em.View.reopen({
    templateForName: function(name, type) {
        if (!name) { return; }

        var templates = Em.get(this, 'templates'),
            template = Em.get(templates, name);

        if (!template) {
            $.ajax({
                url: 'templates/%@.hbs'.fmt(name),
                async: false
            }).success(function(data) {
                template = Ember.Handlebars.compile(data);
            });
        }

        if (!template) {
            throw new Em.Error('%@ - Unable to find %@ "%@".'.fmt(this, type, name));
        }

        return template;
    }
});

更新: Ember 1.0.0-pre.3 以降、このソリューションはおそらく機能しなくなりました (最近の Ember に移行できる可能性があります)。

于 2012-11-20T14:02:57.353 に答える
9

または、Ember.js でプログラムによってハンドルバー テンプレートを定義します。

を使用してプログラムでテンプレートを定義できます。 http://jsfiddle.net/pangratz666/wxrxT/Ember.Handlebars.compileを参照してください。

Ember.View.create({
    personName: 'Dr. Tobias Fünke',
    template: Ember.Handlebars.compile('Hello {{personName}}')
}).append();​

Ember.TEMPLATESまたは、コンパイル済みのテンプレートを配列に追加します。 http://jsfiddle.net/pangratz666/58tFP/を参照してください。

Ember.TEMPLATES['myFunkyTemplate'] = Ember.Handlebars.compile('Hello {{personName}}');

Ember.View.create({
    personName: 'Dr. Tobias Fünke',
    templateName: 'myFunkyTemplate'
}).append();​

Richard Millanが述べたようなツールを使用することをお勧めします。テンプレートのコンパイルをサポートする interline/ember-skeleton も参照してください。

于 2012-04-23T14:10:55.977 に答える
5

したがって、テンプレート用に個別のファイルが必要であり、javascript の文字列でそれらを定義したくなかったので、昨夜これを一緒にハッキングしました

これは同期遅延ローダーで、最初にすべてのテンプレートをロードし、次に ember と残りのコードをロードします。

        //fake function so that every loads fine will get redefined in application.js
        function initializeApp(){}

        function loadTemplates(){
            var arg = arguments[0],
                next = Array.prototype.slice.call(arguments,1);
            if(typeof arg != 'string'){
                arg()
            }else{
                var scriptObj = document.createElement('script');
                scriptObj.type = 'text/x-handlebars';
                $(scriptObj).attr('data-template-name', arg.replace('.handlebars', '').substring(arg.lastIndexOf('/')+1))
                $.get(arg, function(data){
                    scriptObj.text = data;
                    document.head.appendChild(scriptObj);
                    if(next.length > 0) loadTemplates.apply(this, next);
                });
            }
        }

        function loadScripts() {
            var script = arguments[0],
                scriptObj = document.createElement('script'),
                next = Array.prototype.slice.call(arguments,1);
            scriptObj.type = 'text/javascript';
            scriptObj.src = script;
            scriptObj.onload = scriptObj.onreadystatechange = (next.length > 0) ? function(){loadScripts.apply(this, next)} : function(){$(document).ready(function() {initializeApp()})};
            document.head.appendChild(scriptObj);
        }

        function loadApp(obj){
            loadTemplates.apply(this, obj.templates.concat(function(){loadScripts.apply(this,obj.scripts)}))
        }

        window.onload = function(){
            loadApp({
                templates:
                    [
                        '/javascripts/views/templates/nav-bar.handlebars',
                    ],
                scripts:
                    [
                        'https://maps.googleapis.com/maps/api/js?sensor=false&callback=initializeGoogleMaps',
                        '/javascripts/lib/bootstrap.js', 
                        '/javascripts/lib/rails.js', 
                        '/javascripts/lib/ember.js',
                        '/javascripts/application.js',
                        '/javascripts/views/nav_bar.js',
                    ]
            })
        }

編集:私はそれをクリーンアップし、クロムでテストするだけで正しく動作するようにしました

于 2012-04-23T23:57:58.310 に答える
1

Emberをロードする前にテンプレートをDOMにロードする場合は、テンプレートをコンパイルまたは登録する必要はありません。燃えさしが後にやって来て、あなたのためにそれをします。

方法を示す記事は次のとおりです。

http://webdirection.wordpress.com/2012/09/02/loading-handlebars-templates-in-ember-using-curl-js/

于 2012-09-05T06:03:35.897 に答える
1

可能ですが、最初にテンプレートをプリコンパイルする必要があります。これにより、すべてのテンプレートを 1 つのファイルに含めることもできます。

後で、javascript ファイルを含める必要があります。

<script src="path/to/compiled/templates.js" type="text/javascript"></script>
于 2012-04-23T03:30:32.973 に答える
0

Emberビュー/コンポーネント内の別のソリューションは次のとおりです。

var viewClass = Ember.View.extend({ templateName: this.get('contentTemplate') });
var view = this.createChildView(viewClass);
var html = view.renderToBuffer().buffer;
于 2014-07-09T07:14:53.340 に答える
-1

それは可能です。はい、別の別のツールを使用せずに、ember.js を使用するだけでそれを行うことができます。私はこのようにしました:

1) html コード。それらのいずれかを使用する前に、すべてのハンドルバーファイルをロードする必要があることに注意してください。ここでは、handlebars.js という名前のファイルが 1 つだけあります

<body>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
  <script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js"><\/script>')</script>
  <script src="js/libs/ember-0.9.8.1.min.js"></script>    
  <script src="js/handlebars.js"></script>
  <script src="js/app.js"></script>
</body>  

2) このファイル handlebars.js には、ember のコンパイラを使用して、以下が含まれています。

var src = "Hello, <b>{{name}}</b>";
Em.TEMPLATES["say-hello"] = Em.Handlebars.compile(src);

3) app.js ファイル内で、使用可能な状態で使用します (これはそのままです)。

var hu = Em.View.create({
    templateName: "say-hello",
    name: "Allô", 
    mouseDown: function() {  
    window.alert("hello world!");

  }
});

hu.appendTo("body");  
于 2012-07-20T13:54:43.787 に答える