2012-03-22 4 views
2

Я чувствую, как это должно быть, было предложено раньше, но я смотрел наKnockoutjs: обновить привязок после заполнения списка выбора

и

Но эти проблемы были не такими, с которыми я столкнулся.

На мой взгляд, я получаю viewmodel от вызова ajax. В этом объекте находится идентификатор страны. При последующем вызове ajax я извлекаю список стран (имя и идентификатор) и заполняю поле выбора из списка.

поле выбора связанно с ViewModel в стране ID с помощью

<select data-bind="value: CountryId"/> 

Но когда я заполнить выпадающий список, предварительно не выбрана страна ViewModel в. Мне нужно вручную вызвать ko.applyBindings (vm), что является проблемой, поскольку данные заполняются из плагина jQuery, который обрабатывает каскадные поля выбора. У него нет ссылок на viewmodel (и я не хочу его предоставлять). Я мог бы вызвать обратный вызов, но это немного зевает.

Я создал a fiddle, что более подробно иллюстрирует эту проблему. Если вы нажмете кнопку Test Select, вы заметите, что раскрывающийся список предварительно выбран в Item 0. Раскомментируйте строку на панели js, а Боб - ваш дядя.

Что я не получу здесь? Разве это не основная функция нокаута?

-Jules

+0

Я не думаю, что вы сможете делать то, что вы пытаетесь сделать. Связывание значений установит слушателя на «изменение» для выбора, чтобы реагировать при выборе новой опции. Вы просто добавляете опции для выбора, поэтому Knockout не знает, что он должен что-то делать.Даже если бы он знал, он сбросил бы значение до 0, потому что ваши параметры не указывают, какая строка выбрана - значение будет выбрано. –

+0

Думаю, вы, возможно, правы. На данный момент я пошел с механизмом обратного вызова, однако у меня проблема с этим. Обновите вопрос с помощью новой информации. –

+0

Поцарапайте это, я решил вторую проблему. В ближайшее время опубликует ответ на этот вопрос. –

ответ

2

Так как Джон Эрлс сказал, добавление элементов в список выбора не вызывает событие «изменения». Я пришел к выводу, что это действительно хорошая вещь. Из одного из (действительно хороших) нокаутов:

Привязки улавливают события DOM и соответственно обновляют свойства viewmodel.

Это обратное поведение от того, что я хочу! Поэтому я застрял в обратном вызове. В настоящее время он просто вызывает applyBindings(). Вы можете увидеть пример в this revision оригинальной скрипки (обратные вызовы и т. Д. Опущены для ясности).

0

Вы могли бы сделать что-то вроде этого, но вы должны иметь доступ к модели представления:

http://jsfiddle.net/jearles/nw4cH/36/

обусловливая выкл Выбрать, вы предотвратить его оценки, пока вы не заселена наблюдаемый массив (в последующем вызове).

+0

Хм, интересно. Не уверен, что мне нравится идея поставить логику в комментарии, хотя! Как это будет выглядеть, если список выбора заполнен, а затем повторно заселен новым набором значений? –

+0

Вам не нужно использовать синтаксис «без контейнера» ... вы также можете добавить «if» в контейнер div. Если элементы списка выбора изменены, то нокаут переоценивает привязки. Я обновил свой пример, чтобы показать этот синтаксис, и добавил второе обновление и кнопки очистки. http://jsfiddle.net/jearles/nw4cH/77/ –

+0

Это хороший пример, спасибо. Как вы можете видеть, во втором обновлении обновление привязок с DOM -> viewmodel (выбранный элемент изменяется на 5), а не наоборот. На данный момент я пошел с ручным подходом. Спасибо за вашу помощь, чтобы узнать, что происходит. Я бы отметил ваш комментарий в OP выше как ответ, но StackOverflow не имеет этого в качестве опции? –

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