2013-05-30 5 views
2

Я использую то, что я считаю общепринятый ko.bindingHandler.select2:Обновление модели не обновляет вид

ko.bindingHandlers.select2 = { 
    init: function (element, valueAccessor) { 
     $(element).select2(valueAccessor()); 

     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      $(element).select2('destroy'); 
     }); 
    }, 
    update: function (element) { 
     $(element).trigger('change'); 
    } 
}; 

Однако, это, кажется, есть несколько вопросов. В этом вопросе я хотел бы найти ответ о том, как сделать обновление «Просмотр», когда будет произведено изменение модели.

Я создал jsFiddle, который демонстрирует проблему. У меня есть простая функция setTimeout(), которая устанавливает selectedValue модели через 0,25 секунды для эмуляции поведения, аналогичного загрузке данных модели через вызов Ajax. В этом примере выпадающее значение не обновляется при использовании Select2, но, похоже, работает нормально для нормального раскрывающегося списка.

Полное решение: Мой обновленный пользовательский привязки теперь выглядит следующим образом ...

ko.bindingHandlers.select2 = { 
init: function (element) { 
    $(element).select2({}); 

    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
     $(element).select2('destroy'); 
    }); 
}, 
update: function (element, valueAccessor) { 
    var value = valueAccessor(); 
    var valueUnwrapped = ko.utils.unwrapObservable(value); 
    $(element).val(valueUnwrapped).trigger('change'); 
} 

};

В моем HTML Теперь я передаю значение в пользовательскую привязку.

data-bind="select2: selectedValueS2 

ответ

2

ОК, похоже, что я смог выяснить, в чем проблема. Если вы обновляете выпадающее значение при изменении значения, а затем вызвать триггер, он будет работать:

$(element).val(value()).trigger('change'); 

http://jsfiddle.net/tkirda/Mmuvx/5/

+0

Не уверен, что понял вопрос. Кажется, все работает так, как предполагалось. setTimeout изменяет значения, а затем обновляет UI. –

+1

Извините, предыдущий комментарий смотрел на неправильную скрипку. Но ваша скрипка фактически избавляется от специального выделения select2, которое использовал OP. Вы не исправили проблему, вы просто полностью удалили плагин. – Tyrsius

+0

Его скрипка содержит плагин 'select2', кстати. Посмотрите в разделе «Внешние ресурсы». – Tyrsius

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