0

我希望Collection在更新之前读取整个数据库表来填充 Backbone.js View

我正在使用fetch并收听该reset事件。

我的问题是在向服务器发出 http 请求之前会触发重置事件。

我的问题是:如何在从服务器接收回数据后呈现视图?

这是一个显示问题的 jsfiddle(在重置时放置了一个调试器):

http://jsfiddle.net/GhaPF/16/

编码:

$(document).ready(function() {

    var Item = Backbone.Model.extend({
        urlRoot : './items'
    });

    var ItemList = Backbone.Collection.extend({
        model: Item,
        url: './items/',
    });


    var ItemListView = Backbone.View.extend({
        el: 'body',
        initialize: function(myitemList) {
            this.itemlist = myitemList;
            this.itemlist.bind('reset', this.debuggThis());
        },
        debuggThis: function() {
            debugger;
        },
        render: function() {

        },
        events: {
            "keypress #new-item":  "createOnEnter"
        },
        createOnEnter: function(e) {
        }
    });

    $("#new-item").focus();
    var itemlist = new ItemList();
    var myitemListView = new ItemListView(itemlist);
    itemlist.fetch();
});​

以下代码有效,但感觉不像是正确的主干.js (MVC) 代码,因为它会被放置在视图定义之外:

itemlist.fetch().complete(function(){
4

2 回答 2

3

也许问题是这一行:

this.itemlist.bind('reset', this.debuggThis());

实际上应该是:

this.itemlist.bind('reset', this.debuggThis);

您的 debugThis 函数在您为“重置”事件设置侦听器时运行 - 而不是在触发事件时。这告诉 JavaScript 你希望 debugThis 返回一个回调函数,而不是让 debugThis “成为”回调函数。

此外,orangewarp 关于将“this”作为第三个参数传递的评论也可能是相关的。所以它最终会变成:

this.itemlist.bind('reset', this.debuggThis, this);
于 2012-09-10T16:40:18.767 回答
2

那很奇怪。当您fetch()的集合被填充后,应该触发重置事件。所以我认为在 http 请求启动之前发生的重置现象可能不是你想象的那样。

而不是使用完整的...你总是可以像这样使用成功回调选项:

itemlist.fetch({
    success: function() {
        // Whatever code you want to run.
        itemlist.debuggThis();
    }
});

此外,在绑定你的时候,reset你可能想要这个:

this.itemlist.bind('reset', this.debuggThis, this);
于 2012-09-10T16:04:51.650 回答