Javascript 主干:呈现此集合

Javascript 主干:呈现此集合,javascript,backbone.js,Javascript,Backbone.js,这给了我一个未捕获的类型错误:无法读取未定义的属性“models”并且在页面上不显示任何内容。此此.model.models应该是此.collection 在视图中的渲染方法中,您应该使用this.collection.each而不是\uu.each函数 var Text = Backbone.Model.extend({}); Texts = Backbone.Collection.extend({ model: Text, url: '/data.json', });

这给了我一个未捕获的类型错误:无法读取未定义的属性“models”并且在页面上不显示任何内容。

此.model.models
应该是
此.collection

在视图中的渲染方法中,您应该使用
this.collection.each
而不是
\uu.each
函数

var Text = Backbone.Model.extend({});   

Texts = Backbone.Collection.extend({
    model: Text,
    url: '/data.json',
});

var TextsView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this);
        this.render();
    },
    el: "#Texts",
    template: _.template($('#TextTemplate').html()),
    render: function(e){
        _.each(this.model.models, function(Text){
            var TextTemplate = this.template(Text.toJSON());
            $(this.el).append(TextTemplate);
        }, this);
        return this;
    }
})

var Texts = new Texts();
Texts.fetch();
var TextView = new TextsView({collection: Texts});
如果要使用每个函数,则需要直接访问集合中的模型数组,正如@dfsq所指出的那样。这可以通过使用
This.collection.models
来完成

render: function(e){
    this.collection.each(function(Text){
        var TextTemplate = this.template(Text.toJSON());
        $(this.el).append(TextTemplate);
    }, this);
    return this;
}
renderText: function(Text) {
    var TextTemplate = this.template(Text.toJSON());
    this.$el.append(TextTemplate);        
}
编辑2

以下是您的提取调用可能无法工作的一些原因。首先检查您使用的是web服务器,因为出于安全原因,可能会使用文件系统阻止ajax请求。我知道这在Chrome中被阻止,除非你改变某个设置。对Firefox没有把握

第二个原因是fetch
调用是异步的。这意味着运行
initialize

这意味着您需要进行以下调整。首先,您需要向集合的add事件添加一个侦听器,以便在任何时候添加项时,都会通知您的视图

render: function(e){
    _.each(this.collection.models, function(Text){
        var TextTemplate = this.template(Text.toJSON());
        $(this.el).append(TextTemplate);
    }, this);
    return this;
}
接下来,我们需要向视图中添加一个函数,该函数将呈现单个项

initialize: function() {
    _.bindAll(this);
    this.render();
    // Listen to the `add` event in your collection
    this.listenTo(this.collection,"add", this.renderText);  
},
还可以回答关于每个循环中
用户的其他问题。each函数中的最后一个参数是要在执行的回调函数内部使用的范围。因此,如果您使用
this
作为第二个参数,它允许您使用
this
访问您的视图

render: function(e){
    this.collection.each(function(Text){
        var TextTemplate = this.template(Text.toJSON());
        $(this.el).append(TextTemplate);
    }, this);
    return this;
}
renderText: function(Text) {
    var TextTemplate = this.template(Text.toJSON());
    this.$el.append(TextTemplate);        
}
如果不添加此
,则需要执行以下操作:

    this.collection.each(function(Text){
        var TextTemplate = this.template(Text.toJSON());
        $(this.el).append(TextTemplate);
    }, this);

在我看来,它应该是
this.collection.models
。他使用的是主干网,所以
this.collection
指的是他创建的
text
集合。这应该可以使循环工作,但我想您可以使用
this.collection.models
直接访问模型。我不知道。很有趣。实际上你是对的@dfsq。如果使用下划线each方法,则确实需要使用
this.collection.models
。最近一定变了。无论如何,我把它改为在集合中使用each方法。我这么说是因为我刚刚测试了它:)谢谢你的回答。使用
this
作为
函数的第二个参数的目的是什么?我仍然不明白为什么需要这样做。我是个无赖。