Javascript 下划线模板可以';t访问数据模型

Javascript 下划线模板可以';t访问数据模型,javascript,jquery,backbone.js,underscore.js,underscore.js-templating,Javascript,Jquery,Backbone.js,Underscore.js,Underscore.js Templating,我在使用下划线访问模型数据时遇到困难,屏幕上没有显示任何内容,也没有出现任何错误。任何帮助都将不胜感激 这是我的模板区 <script type='text/template' id='ListContainerView'> <p> <%= ListItemModel.id %> </p> <p> <%= ListItemModel.network %> </p> <p> <%= List

我在使用下划线访问模型数据时遇到困难,屏幕上没有显示任何内容,也没有出现任何错误。任何帮助都将不胜感激

这是我的模板区

<script type='text/template' id='ListContainerView'>
 <p> <%= ListItemModel.id %> </p>
 <p> <%= ListItemModel.network %> </p>
 <p> <%= ListItemModel.created_by_id %> </p>
</script>
视图

var ListContainerView = SOCIView.extend({
template: _.template($('#ListContainerView').text()),
className: 'ListContainerView'
})

var SOCIView = Backbone.View.extend({
render: function() {
    if (typeof this.beforeRender === 'function') {
        this.beforeRender();
    }

    var modelData = { };
    if (this.model && this.model instanceof Backbone.Model) {
        modelData = this.model.toJSON();
    }

    if (typeof this.template === 'function') {
        this.$el.html(this.template(modelData));
    }

    if (typeof this.afterRender === 'function') {
        this.afterRender();
    }
    return this;
  }
})
和HTML内的脚本

<script type="text/javascript">
  $(document).ready(function() {
      // Instantiate and render Backbone view
      $('.home_body').append( new ListContainerView({
          collection: new ListItemCollection(),
      }).render().el)
  });
</script>

$(文档).ready(函数(){
//实例化并渲染主干视图
$('.home_body').append(新的ListContainerView({
集合:新建ListItemCollection(),
}).render().el)
});

如果您为
ListContainerView
定义模板,我认为使用
.text()
(而不是
.html()
)可能会导致您的问题。相反,尝试

template: _.template($('#ListContainerView').html())
看看它是否有效


Jquery的
.text()
忽略html标记,如
标记(等),因此它可能也会删除模板标记
,只给您几个空格。

主干模型上的
toJSON
方法为您提供了模型属性的简单副本。就您而言,这是:

modelData = this.model.toJSON();
应该为您提供一个如下所示的对象:

{
  id: 1,
  schedule: "2020-0417 17:00:00",
  utc_offset: "420",
  ...
}
<p> <%= id %> </p>
<p> <%= network %> </p>
<p> <%= created_by_id %> </p>
请注意,该对象中的任何位置都没有
ListItemModel
。该对象适用于如下所示的模板:

{
  id: 1,
  schedule: "2020-0417 17:00:00",
  utc_offset: "420",
  ...
}
<p> <%= id %> </p>
<p> <%= network %> </p>
<p> <%= created_by_id %> </p>
调用模板函数时

或者,您可以使用
{variable:'ListItemModel'}
选项编译模板,并将模板和
this.template
调用单独保留。所以你的观点是:

template: _.template($('#ListContainerView').html(), { variable: 'ListItemModel'),

其余的都不会改变。

好建议,不幸的是没有改变。我觉得我很可能使用ListItemModel.id.错误地访问了数据。。我不能把我的手指放在上面…对不起,我看到了一只虫子,但我应该仔细看看。。。我可以看到两件事:您的
listcainerview
有一个模板,但没有呈现方法,因此当您在脚本中调用render时,它不会做任何事情。在渲染中,您应该将集合中的模型数据提供给模板,以便以某种方式进行渲染。按照您的设置方式,为
ListContainerView
a
render
方法添加模板(将集合中的每个模型输入)到它的
el
可能会起作用。当模板位于
容器中且具有适当的
内容类型
属性时,
.html
就是您想要的。
容器专门用于避免模板中“文本看起来有点像HTML”的问题。