Backbone:更新不调用回调函数

时间:2013-01-14 18:31:12

标签: backbone.js

我正在尝试将功能添加到我的应用中,以便我可以更新我的数据库,然后更新DOM。数据库得到了很好的更新,但DOM却没有。以下是我的观点的一部分:

 App.Views.Table = Backbone.View.extend({
    tagName: 'span',
    initialize: function(options) {
        this.model.on('change', this.render, this);
        this.model.on('update', this.remove, this);

        this.template = this.options.template;
        this.url = this.options.url;
    },
    events: {
        'click .verify': 'verify',
        'click .spam': 'spam',
        'click .duplicate': 'duplicate'
    },
    verify: function(e) {
        id = e.currentTarget.id;
        table = new App.Models.Table({ id: id });
        table.urlRoot = this.url;
        table.fetch();
        table.toJSON();
        table.set('verified', 1);
        table.save();

    },
    spam: function(e) {
        ...

    },
    duplicate: function(e) {
            ...
    },
    remove: function() {
        this.$el.remove();
        console.log('hello');
    },
    retrieveTemplate: function(model) {
        return _.template($('#' + this.template).html(), model);
    },
    render: function() {
        //console.log(this);
        this.$el.html(this.retrieveTemplate(this.model.toJSON()));
        return this;
    }
});

据我了解,this.model.on('update', this.remove, this);应在save完成时调用我的删除功能。但是回调没有触发,因为我没有得到console.log并且我的DOM没有被更新。我究竟做错了什么?我按照教程,但在教程中一切正常。

2 个答案:

答案 0 :(得分:2)

没有update事件。我想你的意思是sync

http://backbonejs.org/#Events-catalog

"sync" (model, resp, options) — when a model has been successfully synced with the server.

我发现调试的一个有用的方法是使用all事件来查看触发了哪些事件。

修改

经过一些调试后,verify()函数的目标是将已验证的属性保存到模型中。为此,我们需要将verify()更改为

this.model.set('verified', 1);
this.model.save();

而不是创建新的App.Model.Table并将其设置为table变量。执行table .save()正在保存 table模型,而不是旧模型this.model。这就是附加到this.model的事件处理程序被触发的原因。

答案 1 :(得分:0)

Backbone.js中没有“创建”或“更新”事件。这就是你的remove()回调没有触发的原因。

请参阅http://backbonejs.org/#Events-catalog以获取Backbone中可能发生的事件的目录。

更新

仔细查看代码后,答案很明确。它们是不同的模型:

initialize: function(options) {
    this.model.on('change', this.render, this);
    this.model.on('sync', this.remove, this);

table = new App.Models.Table({ id: id });
...
table.save();

table对象上发生的事件不会触发绑定到完全不同模型的事件处理程序(this.model)。

为什么在您拥有模型时创建另一个模型(表)? (this.model)?

*更新*

我真的不明白你要做什么,但也许可以试试这个:

table = new App.Models.Table({ id: id });
table.on('sync', this.remove, this);