Ответ 1
Я думаю, что хорошим решением для этого типа проблемы является использование пользовательской привязки. Это будет что-то вроде:
ko.bindingHandlers.doSomething = {
update: function(element, valueAccessor) {
ko.utils.unwrapObservable(valueAccessor()); //grab a dependency to the obs array
//do something based on "element" (the container)
}
}
Вы бы использовали его как:
<ul data-bind="foreach: items, doSomething: items">
<li>...</li>
</ul>
doSomething
должен получить свою зависимость от items
, так как foreach
обновления внутри собственного вычисленного наблюдаемого и в привязках KO 3.0 будут независимыми. Вы также можете передавать параметры doSomething
, а затем захватывать зависимость, обращаясь к наблюдаемому массиву через allBindingsAccessor().foreach
(третий arg), если вы всегда связываете его с foreach
.
Вот пример, который рандомизирует цвет фона каждого элемента в наблюдаемом массиве, когда каждый раз при каждом изменении на наблюдательный массив: http://jsfiddle.net/rniemeyer/SCqaS/