Wewnątrz wyrażenia wiążącego knockout.js mogę używać $data
, $parent
, and $root
pseudovariables. Jak mogę uzyskać ekwiwalent tych pseudozakładów, gdy używam zadeklarowanego w JavaScript JavaScriptu ko.computed
observable?
Mam rodzica viewmodel z kolekcją dzieci, a rodzic viewmodel ma selectedChild
obserwowalne. Biorąc pod uwagę, że mogę używać wyrażeń Databinding dodać klasę CSS w zależności od tego dziecko jest aktualnie wybrany: „jestem wybrany”
<ul data-bind="foreach: children">
<li data-bind="text: name,
css: {selected: $data === $root.selectedChild()},
click: $root.selectChild"></li>
</ul>
<script>
vm = {
selectedChild: ko.observable(),
children: [{name: 'Bob'}, {name: 'Ned'}],
selectChild: function(child) { vm.selectedChild(child); }
};
ko.applyBindings(vm);
</script>
Ale moi ViewModels chce stać się bardziej złożone, i chciałbym aby móc zrobić coś więcej niż tylko dodać pojedynczą klasę CSS do pojedynczego elementu. Naprawdę chcę utworzyć obliczoną właściwość isSelected
na podglądzie potomnym, więc mogę następnie dodać inne właściwości obliczane, które zależą od tego.
Próbowałem tylko pisanie JavaScript, który odnosi się do $data
i $root
na znikoma szansa, że nokaut może określić te zmienne i jakoś trzeba je mieć w zasięgu, gdy zwraca moją funkcję computed
przeprowadzenia ewaluacji:
{
name: 'Bob',
isSelected: ko.computed(function(){ return $data === $root.selectedChild(); })
}
Ale nie ma szczęścia: w moim oceniającym function
, zarówno $data
i $root
są undefined
.
Próbowałem również użyć ko.contextFor
w moim ewaluatorze, ponieważ daje dostęp do $data
i $root
. Niestety, w mojej funkcji ewaluatora, contextFor
również zawsze zwraca undefined
. (I tak nie spodziewałem się dużej nadziei na tę strategię - nie jest jasne, jak dobrze nokaut byłby w stanie śledzić zależności, gdybym musiał pójść za jego plecami).
Zawsze mogłem ręcznie ustawić właściwość dla każdego potomka viewmodel, który odwołuje się do rodzica viewmodel. Ale wiem, że nokaut ma możliwość zrobienia tego dla mnie i chciałbym przynajmniej zbadać, czy mogę użyć jego mechanizmów zanim zacznę pisać własne.
Wydaje się, że powinno być możliwe, aby przetłumaczyć wyrażenie powyżej wiązania do komputerowej obserwowalne - wszak that's what knockout already does:
Drugi schludny Sztuką jest, że deklaratywne Wiązania są po prostu realizowane jako obliczonych obserwabli.
Ale jak mogę iść o kontaktach z $data
i $root
pseudovariables gdy piszę moje własne komputerowej zaobserwować?
dziękuję za drugi przykład! – vittore
jak nazwałbyś funkcję na root, a także kliknięcie: $ root.selectedItem, w ramach tego samego powiązania? – FutuToad
np. To nie działa: kliknij: function() {$ parent.openAlertDialogueEdit ($ data)} // $ dane wydają się być kopią, a nie rzeczywistą referencją. – FutuToad