0

我有一个用户模型(Backbone.js),我想更新其设置属性,然后将其保存到服务器。设置是 JSON 格式,我设置它的方式是设置是字符串版本,settingsJSON 是对象版本。我将函数绑定到每个函数的更改事件,以便当一个函数更改时,它会更新另一个函数。

我遇到的问题是 save 方法在更改的处理程序完成运行之前运行。有什么办法可以确保该模型的所有事件处理程序都是完整的或类似的东西?

我怎么称呼它:

currentUser.get('settingsJSON').apps = appsEnabled;
currentUser.save();

我的事件处理程序:

Initialize: function() {
    var that = this;
    this.on("change:settingsJSON", function(model){
        model.set({settings: JSON.stringify(model.get('settingsJSON'))});
    });

    this.on("change:settings", function(model){
        model.set({settingsJSON: JSON.parse(model.get('settings'))});
    });
}

@fencliff:

当我运行它并正常工作时,更改事件正在触发,我让它将新的设置字符串打印到控制台。

你确定它们是同步调用的吗?我添加console.log('changed')到末尾并在每次控制台读取时直接.on(change)放置:console.log('saved')currentUser.save()

saved
changed

现在我已经完成了,以便在保存之前直接将 JSON 字符串保存到设置中,并且效果很好。

4

1 回答 1

2

主干事件是同步执行的。这意味着除非您(或某个库)覆盖了事件处理的某些部分,否则一旦您执行下一行代码,更改处理程序就会处理。

在您的代码示例中,还有另一个问题。你打电话时

user.get('settingsJSON').apps = appsEnabled;

change事件不会触发,因为 的值settingsJSON没有改变,只是对象的内容被修改了。model.attributes.settingsJSON仍然是和以前一样的对象。

仅当您调用set该属性时才会触发事件,并且新值是不同的对象。例如:

user.set('settingsJSON', _.extend({}, user.get('settingsJSON'), {apps:appsEnabled});

另一个问题似乎是,如果您的事件处理程序被触发,将导致change事件为第一次设置的属性触发两次:

this.on("change:settingsJSON", function(model){
    //-> changes settings, and set triggers change
    model.set({settings: JSON.stringify(model.get('settingsJSON'))});
});

this.on("change:settings", function(model){
    //-> changes settingsJSON, and set triggers change
    model.set({settingsJSON: JSON.parse(model.get('settings'))});
});

要解决该问题,请直接调用set{silent:true}修改model.attributes哈希。

由@muistooshort编辑并更正。

再次编辑并进一步更正

于 2013-01-06T12:21:13.987 回答