2012-02-16 14 views
17

Szukałem od pewnego czasu i jestem przekonany, że jest to nowe pytanie, a nie powtórzenie takie jak sugeruje tytuł. :)Zdarzenie wiązania KnockoutJS po renderowaniu szablonu

Zasadniczo próbuję dowiedzieć się, czy istnieje zdarzenie subskrypcji, które KnockoutJS tworzy po wyrenderowaniu szablonu przy użyciu szablonów jQuery.

Użyłbym wbudowanego "afterRender", ale odkryłem, że nie uruchamia się, jeśli obserwowalna tablica zostanie wyczyszczona. Zbudowałem to demo, aby zilustrować ten problem: http://jsfiddle.net/farina/YWfV8/1/.

Ponadto zdaję sobie sprawę, że mógłbym napisać niestandardowy program obsługi ... ale to wydaje się naprawdę niepotrzebne z tego, czego potrzebuję.

Chcę tylko jedno zdarzenie, które zostanie uruchomione po zakończeniu renderowania szablonu.

Odpowiedz

29

Mój kolega rozwiązał tę ostatnią noc, używając czegoś, z czym graliśmy, zanim wróciłem do domu.

Tak więc cały "problem" związany ze zdarzeniami "afterRender", "afterAdd" i "beforeRemove" polega na tym, że działają one inaczej w powiązaniu z wiązaniem "foreach". KnockoutJS jest na tyle miły, by powiedzieć ci to na swoim page, ale z jakiegoś powodu nie przytył mi tak długo, dopóki nie zobaczyłem tego w praktyce.

Co naprawdę działa to na złom cały „foreach” Wiązanie i używać rodzimych „dane” Knockout za związać tak:

data-bind="template: { name: 'item-template', data: items, afterRender: caller }" 

Wtedy „afterRender” działa dokładnie tak, jak sama nazwa wskazuje.

Miałem wrażenie, że nie można wykonać iteracji kolekcji i renderowania nowego interfejsu bez ograniczeń, ale przykłady te pokazują, że działa.

I się przykład dla obu wariantów viewmodel ponieważ czasami wymagany jest jeden lub drugi .

Dzięki za pomoc Dan !!

+0

Niestety oba pióra są zepsute, z powodu uszkodzonego odniesienia do nokautu. Istnieje również własność 'foreach' dla wiązania szablonu: http://knockoutjs.com/documentation/template-binding.html#note-2-using-the-foreach-option-wa-a-named-template. – Olga

-1

Czy jest to beforeRemove, którego szukasz? Nie jestem pewien, jakie zachowanie chcesz osiągnąć. Proszę sprawdzić ten przykład: http://jsfiddle.net/romanych/YWfV8/8/ Czy tego chcesz, czy nie?

+0

beforeRemove w rzeczywistości go nie zasłania, ponieważ uruchamia się przed renderowaniem szablonu. Muszę dotknąć dokładnie momentu, w którym szablon jest gotowy. – farina