26

バックボーン モデルで属性を設定しているときに渡すと、イベント{"silent":true}が抑制されないのはなぜですか? change:attribute次に属性が変更されたときにそのイベントを発生させる利点は何ですか?

アップデート

Backbone 0.9.10 では、 pass の動作が変更されました{ "silent": true }。変更ログから:

変更を渡す{silent:true}ことで個々の「change:attr」イベントが遅延することはなくなり、代わりに完全に沈黙します。

ここで変更ログを閲覧

4

2 に答える 2

30

これもしばらくの間私を混乱させました。

その理由は、{silent:true}は「すべてを通常どおりに実行するが、イベントをトリガーしない」という意味ではないためです。

@jashkenasによるさまざまなコメントと回答から、「属性値を変更する(そして、それを「changedAttributes」ハッシュに追加する)だけで、他のすべての「変更関連」アクティビティは後で実行する」という意味のようです。

'silent'は、その/それらのプロパティのイベントを防止しません。次のイベントがトリガーchangeされるまで、'announcement'をキューに入れます。change

したがって、おそらく。のような名前の方が適切ですdefer

関連情報:

https://github.com/documentcloud/backbone/pull/850

「サイレント」変更のポイントは、モデルの観点からは変更とは見なされないということです。後で実際に変更が発生すると、一度に完全な違いが得られます。

https://github.com/documentcloud/backbone/issues/870

サイレント変更のポイントは、実際に変更を加えることなく、一時的にモデルの内部状態をいじることができることです。その後、属性が実際に変更されると、検証が実行され、イベントが発行されます。サイレント変更を行うときにエラーイベントを発行することは意味がありません。

2013年4月7日更新

注:動作を確認するためにこれをテストしていません。これは、リリースノートを読んだことに基づいています...

Backbone 0.9.10以降、上記の動作が変更されました。そのバージョン(およびそれ以降)ではsilent:true、イベントを完全に抑制しchange:attrます-単にイベントを遅らせるだけではありません。

http://backbonejs.org/#changelog

于 2012-04-05T14:36:54.450 に答える
2

バックボーン 0.9.2 では、set関数は変更が更新される前に検証を実行します。

  // Run validation.
  if (!this._validate(attrs, options)) return false;

オプションが渡された場合{silent: true}、検証コードは実行されません。

  if (options.silent || !this.validate) return true;

つまり、model.set({value: 100}, {silent: true});「無効な」値をモデルに設定できるため、属性は更新されますが、変更イベントは発生しません。

一部のフィールドを更新してモード全体の検証を防止したい場合に便利です。そのため、モデルがまだ完成していない場合でも、変更は属性に伝播されます。ただし、通常はビューにも変更を表示する必要があるため、手動でmodel.change()またはを呼び出す必要がありmodel.trigger('change:value', model, value)ます。

于 2012-12-16T13:51:57.083 に答える