2014-02-06 3 views
1
for (var i = 0; i < 9; i++) 
{ 
    vm.icdCodes.push({Index:i, ID:'',DiagnosisCd: '' ,Description:ko.observable('')}); 
} 

    <tbody data-bind='foreach: $root.icdCodes'> 
     <tr> 
     <td> 
      <input type="text" class="icdCodeInput" list="icdcodes" data-bind="value: DiagnosisCd, event: { focusout: $root.dxCodeLostFocus}, attr: { id: 'icdCodeInput' + $index() }"> 
      <datalist id="icdcodes" class="icdcodes"> 
      </datalist> 
      <button type="button" class="btn btn-default btn-lg" data-bind=" click: $root.moveDxCodeUp, attr: { id: 'dxCodeUpButton' + $index() }"> 
      <i class="icon-arrow-up"></i> 
      </button> 
      </td> 
     </tr> 
    </tbody> 


vm.moveDxCodeUp = function (data) { 
     if (data.DiagnosisCd != "") 
     { 
      var currentDxCode = data; 
      var previousDxCode = vm.icdCodes()[data.Index - 1]; 
      if (currentDxCode.Index > 0) 
      { 
       vm.icdCodes()[data.Index - 1] = currentDxCode; 
       vm.icdCodes()[data.Index] = previousDxCode; 

       var tempIndex = currentDxCode.Index; 
       currentDxCode.Index = previousDxCode.Index; 
       previousDxCode.Index = tempIndex; 
      } 
     } 

В моем HTML я зацикливаюсь в наблюдаемом массиве icdCodes, чтобы добавить рядом с ним несколько datalist и смежных кнопок HTML 5. Кнопка при нажатии позволяет мне перемещать значение в текущем текстовом поле в текстовое поле, которое находится над ним. В первый раз, когда я нажимаю кнопку, значения меняются правильно. Но если я снова нажму кнопку, параметр data в функции movexCodeUp по-прежнему получит исходное значение (до обмена), а не значение, которое получило взаимозаменяемость после нажатия кнопки. Я также меняю значения в фактической наблюдаемой коллекции (icdCodes) в функции.Перехват события нокаутного щелчка, отправляющий неверные данные

+0

Можете ли вы создать репрограммирование JSFiddle? Ваш код работает отлично: http://jsfiddle.net/JVahL/1/ – nemesv

+0

Единственное различие между моим кодом и вашим состоит в том, что вы добавили одну строку vm.icdCodes.valueHasMutated(). Я не добавляю его. Это может быть причиной, я получаю старое значение после обмена значениями. Я добавлю эту строку и дам вам знать. Благодарю. – user2585299

+0

vm.icdCodes.valueHasMutated() сделал трюк. Спасибо. Поскольку icdCodes является наблюдаемым массивом, почему нам нужно явно называть функцию valueHasMutated? Вы можете изменить свой комментарий, чтобы ответить, и я отметю его. – user2585299

ответ

1

Даже если ваш icdCodes - это ko.observableArray, потому что вы непосредственно манипулируете базовым массивом для замены своих позиций. KO не будет уведомлен об этом, поэтому он не будет повторно отображать представление.

Чтобы сделать его работу вам просто нужно вызвать функцию valueHasMutated которая оповещает KO, что ваш массив изменился:

vm.icdCodes()[data.Index - 1] = currentDxCode; 
vm.icdCodes()[data.Index] = previousDxCode; 
vm.icdCodes.valueHasMutated(); 

Demo JSFiddle.

Смежные вопросы