1

何かが変更されるたびにモデルの自動保存をトリガーしたいと思いますが、変更が UI (つまりビュー) からのものである場合のみです。つまり、変更がデータベースからのものである場合、それを再度保存しても意味がありません。単にデータベースからのものです...

ただしfetch、イベントsaveをトリガーすることができます (モデルの異なる状態をもたらす可能性があり、新しく作成されたモデルをもたらす可能性があるため)changefetchsaveid

そのため、changeイベントでは、変更の原因を知りたいと思います。

たとえば、それはビューからの呼び出しでしたか?:

this.model.set("foo", "bar"); //triggers a change event as foo's value changed

それとも同期操作の結果ですか?:

model.fetch(); //triggers a change event as the model changed in the DB
model.save(); //triggers a change event as the id was empty 

それらを区別する方法はありますか?

私が考えた解決策は、モデルへのビュー呼び出しをメソッドでラップしsetsetAttributeカスタムイベントをトリガーすることchangeDueToUIActionでしたが、これは以前に解決されたと確信しており、より良い方法であると確信しています...

それとも、何かが完全に欠けていて、問題は間違った質問をしていることですか?

4

1 に答える 1

1

多かれ少なかれボイラープレートを含むカスタム ソリューションがいくつかあると思います。そして、定型文を少し追加しますが、簡単なものもあります。(バックボーンに大きな変更がなければ) 変更の原因を知ることはできません (それについて考えてみると、 Model#set
メソッド でどのようにアクセスできますか?)。リスナーでアクセスできるのは 2 つのオブジェクトです。1枚目は変更した機種です。2 番目は、set メソッドを呼び出すときに渡したオプションです。だから私はあなたがそのようなことをすることができると思います:

// in the view
this.model.set('foo', 'bar', {'isFromUI': true});

// in your model
this.listenTo(this, 'change', function(model, flags) {
  if(flags && flags.isFromUI) this.save();
});
于 2013-04-09T08:24:36.600 に答える