2014-11-25 15 views
5

Próbuję dodać klasę do elementu za pomocą Knockout.js w zależności od tego, czy pole wyboru podrzędnego jest zaznaczone, czy nie. Aby to zrobić, próbuję przekazać this jako argument do mojej funkcji. Obecnie moja skrócona struktura DOM jest następujący:Jak przekazać bieżący element do funkcji JavaScript w powiązaniu Knockout.js?

<tr data-bind="css: { selected: isRowChecked(this) }"> 
    <td><label><input type="checkbox"></label></td> 
</tr> 

mój isRowChecked funkcja ta (używam jQuery zlokalizować wejście):

function isRowChecked(elem) { 
    var checkbox = $(elem).find('input[type="checkbox"]'); 
    return checkbox.checked; 
} 

Jednak gdybym console.logelem wszystko ja get to globalny obiekt okna.

Nie jest możliwe użycie jQuery do rozwiązania tego problemu w całości, ponieważ projekt, nad którym pracuję, już prawie całkowicie wykorzystuje nokaut. Jakieś pomysły?

+1

Proszę nie używać jQuery w swoim ViewModels KO! Powinieneś użyć obserwowalnych i sprawdzonego powiązania zamiast śledzić, kiedy zaznaczone jest pole wyboru: http://jsfiddle.net/eqoryb6v/ – nemesv

+0

@ saturesv, ok, to jest pomocne, ale mam wiele wierszy, każdy z jednym polem wyboru. Korzystając z Twojej metody, gdy zaznaczę jedno pole wyboru, * wszystkie * wiersze i pola wyboru są podświetlone. http://jsfiddle.net/eqoryb6v/1/ – ReactingToAngularVues

Odpowiedz

10

Powinieneś być w stanie to osiągnąć, przekazując specjalną zmienną kontekstową wiążącą $ element. Jest to ostatnia zmienna discussed here.

$ elementem

Jest to element obiektu DOM (dla elementów wirtualnych, będzie to obiekt DOM komentarz) bieżącego wiążące. Może to być przydatne, jeśli powiązanie musi uzyskać dostęp do atrybutu bieżącego elementu. Przykład:

<div id="item1" data-bind="text: $element.id"></div>

W twoim przypadku, że będzie wyglądać następująco:

<tr data-bind="css: { selected: isRowChecked($element) }"> 
    <td><label><input type="checkbox"></label></td> 
</tr> 
+0

Znakomity. Dzięki! – ReactingToAngularVues

Powiązane problemy