gpt4 book ai didi

javascript - 保存模型之前等待更改处理程序完成

转载 作者:行者123 更新时间:2023-12-02 19:07:33 25 4
gpt4 key购买 nike

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

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

我如何调用它:

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 字符串并直接保存到设置中,效果很好。

最佳答案

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

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

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'))});
});

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

已编辑并由 @muistooshort 进行更正。

再次编辑并进一步更正

关于javascript - 保存模型之前等待更改处理程序完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14181558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com