2013-07-09 13 views
13

W moim kodu chcę funkcję lub oddzwanianie wykonać tuż po KnockoutJS foreach wiążących wykończeń świadczących wszystkie elementyknockoutJS wykonać zwrotnego foreach po zakończeniu renderowania

wiem, może to zrobić jedynie poprzez sprawdzenie, czy jestem na ostatnim element (znalazłem to tutaj execute code after the last item has been rendered).
Ale używając tej funkcji, moja funkcja oddzwaniania będzie wywoływana za każdym razem, gdy renderowany jest nowy element lub rekord.

Chcę wykonać funkcję zwrotną tylko raz (dla wydajności).

UPDATE

Innym rozwiązaniem jest tutaj success callback after knockout.js finishes rendering all the elements. ale znowu używając tej funkcji, funkcja wywołania zwrotnego będzie wywoływana za każdym razem, gdy renderowany jest nowy element.

+1

masz zaznaczone to pytanie http://stackoverflow.com/questions/14254317/success -callback-after-knockout-js-finish-rendering-all-the-elements? rq = 1? – nemesv

+0

To jest to samo, używając ** afterRender ** spowoduje wywołanie funkcji zwrotnej, każdy element zostanie wyświetlony –

+0

Jeśli sprawdzenie, czy jest to ostatni element, jest pierwszą rzeczą w programie obsługi, to nie będzie działać tak źle. – Tyrsius

Odpowiedz

21

Myślę, że dobrym rozwiązaniem dla tego typu problemów jest użycie niestandardowego powiązania. To byłoby coś takiego:

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) 
    } 
} 

byłoby go używać jak:

<ul data-bind="foreach: items, doSomething: items"> 
    <li>...</li> 
</ul> 

The doSomething musi chwycić własną zależność do items, jak foreach aktualizacjach wewnątrz własnej komputerowej obserwowalne i KO 3.0 wiązania będą niezależne. Można również przekazać opcje do doSomething, a następnie pobrać zależność, uzyskując dostęp do obiektu obserwowalnego przez allBindingsAccessor().foreach (trzeci argument), jeśli zawsze łączysz go z foreach.

Oto przykład, który losuje kolor tła każdego elementu w observableArray gdy raz na każdej zmianie do observbaleArray: http://jsfiddle.net/rniemeyer/SCqaS/

+0

Przepraszam, nie dostałem tego kompletnie, jak to ** doSomething ** zależy od przedmiotów, czy też od tego, jak się to nazywa? –

+0

W KO wiązania są implementowane wewnątrz obliczanego obiektu obserwowalnego. Wszelkie obserwowalne, które mają dostęp do wartości, tworzą zależności. W tym przypadku, wywołując 'ko.utils.unwrapObservable (valueAccessor())' tworzymy zależność, jeśli przekazana wartość była obserwowalna/obserwowalnaArray. Tak więc za każdym razem, gdy obserwowalny jest aktualizowany, ten kod zostanie uruchomiony ponownie. Nadzieja, która pomaga. –

+0

bardzo dobrze .. jeszcze jedno pytanie, jak ** foreach ** zmieni tablicę przedmiotów? Myślę, że to po prostu odczytaj wartości przedmiotów! –

Powiązane problemy