1. ホーム
  2. knockout.js

[解決済み] ノックアウトバインディングでselect時にイベントを変更したいのですが、本当に変更されているかどうかを知るにはどうしたらいいですか?

2023-02-22 02:14:23

質問

私はパーミッションのUIを構築しており、各パーミッションの横に選択リストがあるパーミッションのリストを持っています。パーミッションは、選択リストにバインドされているオブジェクトの観測可能な配列によって表されます。

<div data-bind="foreach: permissions">
     <div class="permission_row">
          <span data-bind="text: name"></span>
          <select data-bind="value: level, event:{ change: $parent.permissionChanged}">
                   <option value="0"></option>
                   <option value="1">R</option>
                   <option value="2">RW</option>
           </select>
      </div>
 </div>

UIが初めてポップアップするときにchangeイベントが発生することです。私はajax関数を呼び出し、権限リストを取得し、そして権限アイテムのそれぞれについてイベントが発生します。これは私が望んでいる動作ではありません。私はそれが発生するようにしたい を発生させたいのです。ユーザーが本当に選択リストで許可のための新しい値を選んだときだけです。 どうすればいいですか?

どのように解決するには?

実は イベントがユーザによって引き起こされたのか、それともプログラムによって引き起こされたのかを知りたいのです。 であり、初期化中にイベントが発生することは明らかです。

ノックアウト方式で subscription を追加することは、すべてのケースで役立つわけではありません。

  1. 未定義のデータでモデルを開始します。 (actual KO initilization)
  2. 初期データでモデルを更新する (logical init like load JSON , get data etc)
  3. ユーザーとの対話と更新

実際にキャプチャしたいステップは3の変更点ですが、2番目のステップで subscription が呼び出されます。 そこで、より良い方法は、次のようにイベントの変更に追加することです。

 <select data-bind="value: level, event:{ change: $parent.permissionChanged}">

でイベントを検出し permissionChanged 機能

this.permissionChanged = function (obj, event) {

  if (event.originalEvent) { //user changed

  } else { // program changed

  }

}