knockout.js - 改變選擇與敲除綁定事件,我怎麼知道它是否是一個真正的變化




4 Answers

實際上, 你想要查找事件是由用戶還是程序觸發的 ,並且很明顯,該事件在初始化時會觸發。

添加subscription的淘汰方式在所有情況subscription都無濟於事,為什麼呢,因為在這個模型的大部分內容都會這樣實施

  1. 用未定義的數據初始化模型,只是結構(actual KO initilization)初始化(actual KO initilization)
  2. 用初始數據更新模型(logical init like load JSON , get data etc)
  3. 用戶交互和更新

我們想要捕獲的實際步驟是3中的更改,但是第二步subscription將獲得呼叫,所以更好的方法是添加到事件更改

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

並在permissionChanged函數中檢測到該事件

this.permissionChanged = function (obj, event) {

  if (event.originalEvent) { //user changed

  } else { // program changed

  }

}

我正在構建權限用戶界面,我擁有每個權限旁邊的選擇列表的權限列表。 權限由綁定到選擇列表的可觀察數據對象表示:

<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>

現在問題是這樣的:當用戶界面第一次填充時,會引發更改事件。 我打電話給我的ajax函數,獲取權限列表,然後為每個權限項目引發事件。 這真的不是我想要的行為。 我希望只有在用戶真正為選擇列表中的權限挑選出新值時才會引發此問題 ,我該怎麼做?




這是一個解決方案,可以幫助這種奇怪的行為。 我找不到比放置按鈕手動觸發更改事件更好的解決方案。

編輯:也許像這樣的自定義綁定可以幫助:

ko.bindingHandlers.changeSelectValue = {

   init: function(element,valueAccessor){

        $(element).change(function(){

            var value = $(element).val();

            if($(element).is(":focus")){

                  //Do whatever you want with the new value
            }

        });

    }
  };

並在你選擇的數據綁定屬性中添加:

changeSelectValue: yourSelectValue



如果您使用observable而不是原始值,則select不會在初始綁定時引發更改事件。 您可以繼續綁定到更改事件,而不是直接訂閱observable。




我有一個類似的問題,我只是修改事件處理程序來檢查變量的類型。 該類型只在用戶選擇一個值之後設置,而不是在第一次加載頁面時設置。

self.permissionChanged = function (l) {
    if (typeof l != 'undefined') {
        ...
    }
}

這似乎對我有用。




Related