2012-01-10 4 views
26

Chciałbym powiązać widoczną właściwość, aby była prawdziwa, gdy jeden z dwóch warunków jest spełniony. Coś w rodzaju następującego:Powiązanie widocznego parametru z instrukcją "lub" w Knockout

Mój kod działa, gdy wykonuję jedno lub inne powiązanie, ale nie, gdy wstawiam || tam. Nie znalazłem żadnej dokumentacji, która mówi, że mogę umieścić dowolną logikę w tym powiązaniu, ale jeśli nie mogę tego zrobić bezpośrednio, jaki jest najlepszy sposób, aby to zrobić, ponieważ wiążę własność szablonu i jeden obiekt $ parent viewmodel.

Odpowiedz

39

Jeśli używasz wartości obserwowalnej w wyrażeniu, musisz odwoływać się do nich jako funkcji. Tak więc, jeśli active i displayDeactive są obserwable byś zrobił:

data-bind="visible: active() || $parent.displayDeactive()"

Istnieje kilka sposobów, aby przenieść go do modelu widoku, można:

  • utworzyć obliczany obserwowalne na dziecko (funkcja będzie musiała być w stanie odwołać się do rodzica)
  • utworzyć funkcję na rodzica, która przyjmuje dziecko i zwraca twoją wartość (wiązania są wykonywane w obliczonym observable, więc będzie strzelał ponownie, gdy jakikolwiek zauważalny, że uzyskuje dostęp zmiany)
  • utworzyć funkcję na dziecko, które ma w dominującej i zwraca wartość (ta sama uwaga jak wyżej)

Próbka logiki w wiązaniu i stosując funkcję rodzica tutaj: http://jsfiddle.net/rniemeyer/f6ZgH/

+0

Dzięki, wiedziałem, że to będzie coś prostego. I dziękuję za całą twoją pracę nad Knockout. Z pewnością to doceniam. – PlTaylor

6

Dodaj pareny po obserwowalnych, ponieważ je oceniasz.

<input type="checkbox" data-bind="checked:displayDeactive"> Display deactive</input> 
<br/><br/> 
<table> 
    <tbody data-bind="foreach: products"> 
     <tr data-bind="visible: active() || $parent.displayDeactive()"> 
      <td><span data-bind="text:name"></span></td> 
     </tr> 
    </tbody> 
</table> 

można znaleźć pełny kod tutaj: http://jsfiddle.net/johnpapa/gsnUs/

Można użyć właściwości obliczoną na szablonie elementu, który oblicza wyrażenie (tylko zobaczył @RPNiemeyer odpowiedział, że zbyt ... I +1 're).