根据文档,Backbone / Underscore _.each(...)似乎不起作用

时间:2013-08-17 20:39:29

标签: backbone.js underscore.js

在此代码中......

_.each(this.photos, function(element,index,list) {
    console.log('element...');
    console.log(element);
    var photoView = new PhotoView({photo:element});
    self.$el.append(photoView.render());
});

element是整个this.photos集合。为什么不是集合中10个中的一个照片元素?

编辑:这是填充照片集的方法....

loadPhotos: function(memberId) {
    var self = this;
    this.photos = new PhotosCollection([]); 
    this.photos.on('error', this.eventSyncError, this);
    this.photos.fetch({
        url: this.photos.urlByMember + memberId, 
        success: function(collection,response,options) {
            console.log('Fetch photos success!');
            self.render();
        }
    });
},

该集合可以很好地加载模型。在Chrome控制台中,我可以看到模型集合。我不确定是什么问题。我不能用下面海报推荐的任何方法来迭代这个集合。

3 个答案:

答案 0 :(得分:3)

您错误地使用了_.each方法。 underscore methods需要直接调用集合:

this.photos.each(function(element,index,list) {
    console.log('element...');
    console.log(element);
    var photoView = new PhotoView({photo:element});
    self.$el.append(photoView.render()); 
});

或者,如果您想使用_.each,则需要传递models property而不是集合对象本身作为列表:

_.each(this.photos.models, function(element,index,list) {
    console.log('element...');
    console.log(element);
    var photoView = new PhotoView({photo:element});
    self.$el.append(photoView.render());
});

答案 1 :(得分:0)

应该使用this.photos.each(function(elt, index, list){...})代替_.each(this.photos,...),因为this.photos不是下划线_.chain对象。

答案 2 :(得分:0)

感谢您的建议!如果没有上述所有建议,我绝不会想到这一点。所以这就是问题......

在父视图中,这会加载特定成员的照片记录......

loadPhotos: function(memberId) {
    var self = this;
    this.photos = new PhotosCollection([]); 
    this.photos.on('error',this.eventSyncError,this);
    this.photos.fetch({
        url: this.photos.urlByMember + memberId, 
        success: function(collection,response,options) {
            self.render();
        } 
    });
},

仍然在父视图中,Backbone.Subviews在渲染时使用它来调用每个子视图。请注意我如何将this.photos传递给subvw-photos ......

subviewCreators: {
    "subvw-profile": function() {
        var options = {member: this.member};
        // do any logic required to create initialization options, etc.,
        // then instantiate and return new subview object
        return new ProfileView( options );
    },
    "subvw-photos": function() {
        var options = {photos: this.photos};
        return new PhotosView( options );
    },
    "subvw-comments": function() {
        var options = {};
        return new CommentsView( options );
    }
},

这是在subvw-photos子视图中。请注意intialize如何接受集合作为参数。看到这个问题?...

initialize: function(photos) {
    Backbone.Courier.add(this);
    this.photos = photos;
},

render: function() {
    console.log('rendering photosview now...');
    var self = this;
    this.photos.each(function(element,index,list) {
        var photoView = new PhotoView({photo:element});
        $(self.el).append(photoView.render());
    });
    return this;
},

我正在将一个包装照片集的对象传递给initalize,但后来对待它就像它只是照片集的参考。我不得不将subvw-photos初始化为以下内容......

initialize: function(args) {
    Backbone.Courier.add(this);
    this.photos = args.photos;
},

当然,所有其他代码神奇地开始工作: - /

再次感谢您的提示!你肯定让我走上正轨: - )