4

ビュー内の要素にバインドされた多くのイベントがありますが、stickit jsを使用してモデルを変更することでビュー内の値を変更しても、onChangeイベントはトリガーされません。

バインディングごとにハンドラーを作成しなくても、モデルに値を設定した後、現在のmodel:elementのonchangeイベントをトリガーする方法はありますか?これは、すべてのフォーム要素、input / select/textareaに当てはまります。

ページ上の各フォーム要素について、次のことを避けたいと思います。

bindings: {
    '#foo': {
         observe: 'foo',
         afterUpdate: 'forceChange'
    },
    '#bar': {
         observe: 'bar',
         afterUpdate: 'forceChange'
    },
    ...
},

forceChange: function(el) { jQuery(el).change() }
4

2 に答える 2

5

考えられるハックの1つ(バージョン0.6.3のみ)は、すべての要素に一致するグローバルハンドラーを定義することです。

Backbone.Stickit.addHandler({
  selector: '*',
  afterUpdate: function($el) {
    $el.trigger('change');
  }
});

afterUpdateハンドラーは、定義されている順序で他の一致するハンドラーおよびバインディング構成と混合されるため、バインディング構成が最後に混合されるため、このグローバルなすべて一致するハンドラーを上書きせずに、どのバインディングでも使用できませんでした。 。ここでそれについてもっと読むことができます。

于 2013-03-26T12:24:55.010 に答える
1

ああ、そのコメントは問題を明確にします。そのため、Javascriptでは、入力の値を「手動で」(jQueryまたはを介してsomeElement.value =)変更すると、お気づきのように、ブラウザーは変更イベントを発生させません。変更イベント(およびそのことに関する他のほとんどのイベント)は、Javascriptではなく、ユーザーアクションに応答してのみ発生します。

幸い、値を「手動で」変更できるのと同じように、イベントを「手動で」トリガーすることもできます。jQueryでは、その構文は次のとおりです。

$(yourElement).trigger('change');

e.targetjQueryのtriggerドキュメントで詳細を確認できるようなものを制御する必要がある場合は、それが基本的な考え方です。

必要に応じて、値の変更とイベントのトリガーを連鎖させることもできます。

$(yourElement).val('newValue').trigger('change');
于 2013-03-26T00:06:57.387 に答える