2012-09-07 9 views
7

Zasadniczo chcę ponownie zastosować wiązania na tej samej stronie dla różnych obiektów, ale jest dziwne zachowanie. Po ponownym zastosowaniu wiązania lista elementów zostaje utracona.Ponownie zastosować wiązania w nokaucie

Proszę zobaczyć tutaj: http://jsfiddle.net/baio/9UcUs/5/

Co robić?

+0

To nie może być pytanie bezpośrednio, ale bardziej standardowe podejście z nokautem wiąże się z modelem widoku, a następnie zmienia się zawartość modelu, zamiast zmieniać cały model za każdym razem. Zobacz przykład: http://jsfiddle.net/9UcUs/8/. –

+0

Odpowiedni kod powinien zawsze być *** w *** pytaniu, nie tylko powiązanym (nawet nie jsFiddle). –

Odpowiedz

6

Krótka odpowiedź brzmi, że nie jest obsługiwana. Długa odpowiedź brzmi, że istnieją pewne sposoby obejścia tego problemu. Jednym ze sposobów jest wywołanie cleanNode przed applyBindings, ale to nie wyczyści procedur obsługi zdarzeń. Innym sposobem jest zawijanie modelu widoku w obserwowalne, a następnie aktualizowanie, które można obserwować, aby ponownie zastosować wiązania; działa to znacznie lepiej, ale nadal ma niewielki problem (patrz poniżej).

Oto Twój przykład używając do zaobserwowania sposobu widok modelu http://jsfiddle.net/mbest/9UcUs/9/

Jedyny problem mam z użyciem zaobserwowania widoku modelu jest to, że znaleziono obsługi zdarzeń nie są całkowicie na bieżąco z nowym modelu widoku. Wywołają poprawną funkcję w nowym modelu widoku, ale wartości dla oryginalnego widoku będą miały wartości this i data.

EDIT:

Knockout 3.0 (obecnie ukazać w tym miesiącu) w pełni obsługuje modele obserwowalne widok. Nadal mogą występować problemy z niestandardowymi powiązaniami, ale mam nadzieję, że wszystko to zostanie wkrótce udokumentowane.

4

możesz powiązać ten sam model z różnymi elementami, musisz podać element, który chcesz zastosować do wiązania.

ko.applyBindings(vm, $('#yourul')); 

ko.applyBindings(vm, $('#div')); 
+6

Pamiętaj, że Knockout nie zależy od jQuery: zamiast tego użyj '$ ('# yourul') [0]' i '$ ('# div') [0]' zamiast –

0

robi:

ko.applyBindings(viewModel, $('#somejQObj')[0]); 

Works jak podano w komentarzach użytkownika @ fengd odpowiedź. Obecnie istnieje tabela zapełniana przez instrukcję foreach, która ma rozwijane wiersze, z których każdy ma dynamicznie dodawaną pod-tabelę, która jest również wypełniana przez instrukcję foreach. Po dynamicznym wstawieniu każdej tabeli podrzędnej, powyższe ustawia powiązania dla pod-tabeli i zapełnia dane.

Powiązane problemy