0

ユーザー モデル (Backbone.js) があり、その設定属性を更新してサーバーに保存したいと考えています。設定は JSON 形式で、設定は文字列バージョンで、settingsJSON はオブジェクト バージョンです。関数をそれぞれの変更イベントにバインドして、一方が変更されると他方が更新されるようにします。

私が抱えている問題は、変更されたハンドラーの実行が完了する前に保存メソッドが実行されていることです。そのモデルのすべてのイベントハンドラーが完全であることを確認する方法はありますか?

私はそれをどのように呼んでいますか:

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

@フェンクリフ:

これを実行すると変更イベントが発生し、正常に動作します。新しい設定文字列をコンソールに出力しました。

それらが同期的に呼び出されていると確信していますか? console.log('changed')の最後に追加し、コンソールが読み取るたび.on(change)console.log('saved')直後に追加しました:currentUser.save()

saved
changed

今のところ、JSON を厳密に保存し、保存する前に直接設定に保存して、正常に動作するようにしました。

4

1 に答える 1

2

バックボーンイベントは同期的に実行されます。つまり、ユーザー(または一部のライブラリ)がイベント処理の一部をオーバーライドしない限り、次のコード行を実行するとすぐに変更ハンドラーが処理されます。

コード例では、別の問題があります。電話するとき

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

の値が変更されておらず、オブジェクトの内容が変更されただけなので、changeイベントは発生しません。settingsJSONmodel.attributes.settingsJSON以前と同じオブジェクトです。

イベントは、プロパティを呼び出しsetたときにのみ発生し、新しい値はのオブジェクトです。例えば:

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

もう1つの問題は、イベントハンドラーがトリガーされた場合、change最初に設定されたプロパティに対してイベントが2回発生することです。

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 に答える