0

基本上,我正在尝试向我的节点服务器发送一个 GET 请求,以便我可以取回博客文章以创建链接。我做了一个collection.fetch,它成功完成了 GET 请求(节点服务器记录它正在发送正确的对象)。该模型成功解析了正确的数据,但是当我尝试使用该集合时,它说它是空的。这是代码:

var mdm = mdm || {};

// MODEL
mdm.Post = Backbone.Model.extend({
        parse: function( response ) {
        response.id = response._id;
        console.log(response); // logs the two documents
        return response;
    }
});

// COLLECTION
mdm.Posts = Backbone.Collection.extend({
    model: mdm.Post,
    url: '/api/posts'
});

// MODEL VIEW
mdm.LinkView = Backbone.View.extend({
    template: _.template( $('#link_template').html() ),

    render: function() {
        this.$el.html( this.template( this.model.toJSON() ));
        return this;
    }
});

// COLLECTION VIEW
mdm.LinksView = Backbone.View.extend({
    el: '#link_list',

    initialize: function() {
        this.collection = new mdm.Posts();
        this.collection.fetch({reset: true});
                // makes the request properly, but collection is empty
        this.render();
                // never gets called because the collection is empty
        console.log(this.collection.length); 
                // logs a length of 0
    },

    render: function() {
        // renders collection
    }
});

$(function() {
    new mdm.LinksView();
});

数据正在发送并在模型中解析,所以我不确定集合最终是空的。任何帮助将不胜感激。

4

2 回答 2

1

您没有在视图中看到模型的最可能原因是渲染是在异步fetch完成之前发生的。

像下面这样的东西会更好:

mdm.LinksView = Backbone.View.extend({
    el: '#link_list',

initialize: function() {
    this.collection = new mdm.Posts();
    this.listenTo(this.collection, 'reset', this.render);
    this.collection.fetch({reset: true});
}

reset上面的代码为 上的事件设置了一个侦听器,collection并在发生这种情况时执行该render函数。

此外,您也可以将处理程序传入success并手动调用渲染函数。errorfetch

this.collection.fetch({
    success: _.bind(function() { 
        this.render(); }, this)
});

希望这可以帮助!

于 2013-11-07T03:57:17.277 回答
0

根据@fbynite 的评论,问题与fetch异步有关。我对集合视图进行了以下更改,并且成功了:

initialize: function() {
    var self = this;
    this.collection = new mdm.Posts();
    this.collection.fetch({reset: true,
        success: function() {
            self.render();
            console.log(self.collection.length);
        }
    });
},

该代码是对 Backbone 教程的修改,因此其他用户可能会遇到类似的问题。http://addyosmani.github.io/backbone-fundamentals/#exercise-2-book-library---your-first-restful-backbone.js-app

于 2013-11-07T03:55:34.067 回答