簡體   English   中英

等到變更處理程序完成后再保存模型

[英]waiting till an on change handler is complete before saving model

我有一個用戶模型(Backbone.js),我想更新其設置屬性,然后將其保存到服務器。 設置采用JSON格式,我設置的方式是設置是字符串版本,而設置JSON是對象版本。 我將函數綁定到每個函數的change事件,以便當一個函數更改時,它更新另一個函數。

我遇到的問題是,在更改的處理程序完成運行之前,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:

當我運行它並正常工作時,change事件就會觸發,我讓它將新的設置字符串打印到控制台。

您確定它們被同步調用嗎? 我將console.log('changed').on(change)的末尾,並將console.log('saved')直接放在currentUser.save()並且每次控制台讀取時:

saved
changed

現在,我已經做到了,以便我嚴格保存JSON並在保存之前將其直接保存到設置中,並且效果很好。

骨干事件是同步執行的。 這意味着除非您(或某些庫)重寫了事件處理的某些部分,否則更改處理程序將在您執行下一行代碼后立即進行處理。

在您的代碼示例中,還有另一個問題。 你打電話時

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

因為未更改settingsJSON的值,僅修改了對象的內容,所以不會觸發change事件。 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進行更正后編輯

再次編輯 ,進一步更正

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM