2013-12-10 3 views
1

У меня проблема с Knockout, которая кажется немного озадачивающей.KnockoutJS не обновляет вид

У меня есть список контактов, которые я хочу связать с пользовательским интерфейсом (наблюдаемый массив).
Однако я не нуждаюсь в том, чтобы элементы сами по себе наблюдались, поскольку они обновляются только через диалоговое окно, и мне не нужно, чтобы каждое поле отслеживалось отдельно.

У меня есть следующие jsFiddle, чтобы продемонстрировать мою проблему:

http://jsfiddle.net/EsgGg/12/

var c = contacts()[0]; 
c.name="James"; 
contacts.splice(0, 1, c); 
// the contacts observableArray is now correct but the UI is unchanged 

По какой-то причине метод сращивания не обновляет вид ??

Заранее спасибо.

Я действительно думаю, что Knockout должен позволить триггер («изменить») или какой-либо другой метод на наблюдаемых, чтобы облегчить этот тип вещей.

ответ

2

Нокаут имеет триггер изменения на наблюдаемых. Это называется valueHasMutated()

contacts.valueHasMutated(); 

Но на самом деле вы лучше, если каждое значение, которое показывает на экране (и при условии случайного изменения) является актуальным наблюдаемым в модели представления.

contacts()[0].name("James"); // done 
+0

Спасибо за внимание к этому методу. Проблема с отображением каждого отдельного поля заключается в том, что обновление их с сервера с помощью JSON намного сложнее. Также зачем отслеживать значения, если они никогда не будут меняться индивидуально? 1. открыть править Диалог (jQueryUI) 2. скопировать значения контактов в форму внутри диалогового окна 3. при нажатии кнопки сохранения считывать значения формы в объект JS 4. заменить запись в списке контактов. Другим способом для # 4 будет перебирать каждое свойство JS и вызывать наблюдаемый каждый раз при вызове рендера на странице. – DavidMedlock

+2

Вот что создано [плагин отображения] (http://knockoutjs.com/documentation/plugins-mapping.html). С очень небольшим усилием он выполняет все необходимые вам сопоставления. Он может даже отображать только половину вашего JSON, если вы настроите его на это. Он также заботится о том, чтобы отобразить все, если вы хотите обновить сервер. – Tomalak

+0

Вы избили меня до комментария о картографическом плагине. @DavidMedlock, вам не нужны свойства, которые можно наблюдать для шага № 2 в вашем комментарии? Если свойства не наблюдаются, как нокаут знает, что значения в текстовых боксах вашей формы изменились, и соответственно обновить свойства в вашей модели просмотра? – danludwig

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