0

以下の行は完全に失敗しています。

template: _.template($('#test').html()),

https://github.com/ccoenraets/backbone-jquerymobileの簡単な例に従って、Backbone.js と共に jQuery モバイルを使用しようとしています。Web インスペクターで表示されるエラーは次のとおりです: TypeError: 'null' is not an object (evaluating 'str.replace') which is in line 913 of underscore.js. is _.template を次のように使用します。

template: _.template("<h1>To Do</h1>"),

動作しますが、jQuery モバイル スタイルを組み込むには、この方法ではうまくいきません。

todo.js

TodoBb.Views.ComCentersTodo = Backbone.View.extend({

template: _.template($('#test').html()),


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

main.html

<script type = 'text/template' id = 'test'> <h1>To Do</h1> </script>
4

1 に答える 1

2

ビューが解析されているとき、DOM は準備ができていません。

TodoBb.Views.ComCentersTodo = Backbone.View.extend({
    template: _.template($('#test').html()),
    //...
});

そう$('#test').html()ですnull、そしてあなたは実際にこれをやっています:

TodoBb.Views.ComCentersTodo = Backbone.View.extend({
    template: _.template(null),
    //...
});

テンプレートを JavaScript 関数に変換する際の内部_.template使用。replace

いくつかのオプションがあります:

  1. ハンドラーTodoBd.Views.ComCentersTodo内に定義を入れます。$(document).ready()

    $(function() {
        TodoBb.Views.ComCentersTodo = Backbone.View.extend({
            template: _.template($('#test').html()),
            //...
        });
    });
    
  2. 必要になるまでテンプレートをコンパイルしないでください。

    TodoBb.Views.ComCentersTodo = Backbone.View.extend({
        //... no template in here
        render: function() {
            var html = _.template($('#test').html(), this.model.toJSON());
            this.$el.html(html);
            return this;
        },
        //...
    });
    

2のバリエーションとして、コンパイルされたテンプレート関数をどこかにキャッシュし_.template($('#test').html())、最初に使用するときにのみ呼び出すことができます。

于 2012-06-22T01:14:13.300 に答える