KnockoutJS выполняет обратный вызов после того, как foreach завершает рендеринг - программирование

KnockoutJS выполняет обратный вызов после того, как foreach завершает рендеринг

В моем коде я хочу выполнить функцию или обратный вызов сразу после того, как привязка KnockoutJS foreach завершает рендеринг всех элементов

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

Я хочу выполнить функцию обратного вызова только один раз (для производительности).

ОБНОВЛЕНИЕ

другое решение находится здесь обратный вызов успеха после того, как knockout.js завершает рендеринг всех элементов. но снова используя эту функцию callback, вызывается каждый раз при визуализации нового элемента.

4b9b3361

Ответ 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/