изменить событие при выборе с привязкой нокаута, как я могу узнать, если это реальное изменение

Я создаю пользовательский интерфейс разрешений, у меня есть список разрешений со списком выбора рядом с каждым разрешением. Права доступа представлены наблюдаемым массивом объектов, которые привязаны к списку выбора:

<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, получаю список разрешений, а затем вызывается событие для каждого из элементов разрешений. Это действительно не то поведение, которое я хочу. Я хочу, чтобы он вызывался только тогда, когда пользователь действительно выбирает новое значение для разрешения в списке выбора , как я могу это сделать?

77 голосов | спросил guy schaller 18 J0000006Europe/Moscow 2012, 10:42:56

1 ответ


0

На самом деле вы хотите узнать, было ли событие инициировано пользователем или программой , и очевидно, что событие будет инициировано во время инициализации.

Подход с добавлением subscription не поможет во всех случаях, потому что в большинстве случаев модель будет реализована так

  1. инициализировать модель с неопределенными данными, просто структура (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

  }

}
ответил Sarath 5 ThuEurope/Moscow2013-12-05T14:35:48+04:00Europe/Moscow12bEurope/MoscowThu, 05 Dec 2013 14:35:48 +0400 2013, 14:35:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132