2014-01-23 2 views
1

Только что заметил какое-то неожиданное поведение в knockout.js. Получил некоторый код, который обходит вокруг наблюдаемого массива и повторяет некоторые связанные элементы HTML для каждого элемента массива. Один из предметов - это свойство на под-объекте:Нокаут останавливает обновление наблюдаемого после распаковки свойства

<tbody data-bind="foreach: Contact"> 
    <tr> 
     <td data-bind="text: Name"></td> 
     <td data-bind="text: Project().Name"></td> 
     <td data-bind="text: Percentage"></td> 
    </tr> 
</tbody> 

Это изделие отличное на странице загрузки. Но если пользователь выполняет действия, которые в конечном итоге изменяют массив Contact или элементы внутри него, Name и Project(). Обновление имени, но Percentage не работает, хотя при переходе через показывает, что оно имеет правильное значение.

Однако, если удалить распакованный подобъект:

<tbody data-bind="foreach: Contact"> 
    <tr> 
     <td data-bind="text: Name"></td> 
     <td></td> 
     <td data-bind="text: Percentage"></td> 
    </tr> 
</tbody> 

Все работает отлично.

Что здесь происходит, и есть ли исправление лучше, чем использование вычисленного наблюдаемого или somesuch для вычисления и хранения моего Project(). Значение имени?

+0

из любопытства, это изменение порядка влияет на проблему? т. е. если Project(). name отображается последним, разрешает ли Percentage рендеринг? –

+0

Можете ли вы воспроизвести его в jsfiddle? Также '' и т. Д., Вероятно, должен быть '' – sroes

+0

- Joseph - да, он отлично работает, если Project(). last ... sroes. Я попытаюсь собрать что-то вместе, но у нас есть сложное приложение, и я не всегда могу воспроизвести проблемы в простом приближении jsfiddle. –

ответ

0

попробовать этот

<td data-bind="text: ko.computed(function() { return Project().Name() })"></td> 

если вам нужен 2-полосная привязки, вы можете использовать для записи вычислен

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