4

我是 Backbone JS 的新手,一直在关注Christopher Coenraets Wine Cellar 教程

这一切都很好而且花花公子,但我不明白他是如何使用this.model.models来访问集合而不是this.collection. 此外,当我尝试将代码更改为后者时,它似乎this.collection是未定义的。

window.WineListView = Backbone.View.extend({

    tagName:'ul',

    initialize:function () {
        this.model.bind("reset", this.render, this);
    },

    render:function (eventName) {
        _.each(this.model.models, function (wine) {
            $(this.el).append(new WineListItemView({model:wine}).render().el);
        }, this);
        return this;
    }

});
4

1 回答 1

6

有两件事让你感到沮丧:

  • 您可以根据需要在视图中注入集合。通常的方法是传递一个集合属性,但这里它是作为路由器中的模型传递的:

    this.wineList = new WineCollection();
    this.wineListView = new WineListView({model:this.wineList});
    
  • collection.models在集合中保存模型的原始数组

    models collection.models
    对集合内模型的 JavaScript 数组的原始访问。通常您会希望使用 get、at 或 Underscore 方法来访问模型对象,但有时需要直接引用数组。

如果要this.collection在视图中使用,则应将路由器修改为

this.wineList = new WineCollection();
this.wineListView = new WineListView({collection: this.wineList});

然后您可以将其用作

window.WineListView = Backbone.View.extend({
    tagName: 'ul',

    initialize: function () {
        this.collection.bind("reset", this.render, this);
    },

    render: function (eventName) {
        // Backbone proxies Underscore methods on collections
        // _.each(this.collection.models, function (wine) {

        this.collection.each(function (wine) {
            $(this.el).append(new WineListItemView({model: wine}).render().el);
        }, this);

        return this;
    }
});
于 2013-01-04T12:17:14.330 回答