0

下面的行完全失败了。

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

尝试按照https://github.com/ccoenraets/backbone-jquerymobile中的一个简单示例将 jQuery mobile 与 Backbone.js 一起使用。我在网络检查器中遇到的错误是:TypeError: 'null' is not an object (evalating 'str.replace') 位于 underscore.js 的第 913 行。以这种方式使用 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 回答