2012-02-16 9 views
11

Z Knockout 2,0 stosując te dane-wiązania:Parametry Knockout 2.0 z bindowania w niepoprawnej kolejności?

data-bind="click: $root.deleteSomeEntity.bind($data, $parent)" 

w viewmodel Knockout JavaScript pierwszy argument w

self.deleteSomeEntity = function (data, parent) { 
    // perform deletion 
} 

wydaje się być rodzicem niż dane.

Czy istnieje przyczyna takiego zachowania lub czegoś, czego mi brakuje?

Odpowiedz

12

Po wywołaniu bind pierwszym parametrem będzie wartość this. Tak więc w twoim wywołaniu this będzie $data, a pierwszym argumentem będzie $parent.

Jeśli $root jest $parent w tym przypadku, to możesz po prostu zrobić:

$root.deleteSomeEntity.bind($root)

KO minie dane jako pierwszy parametr i this zostanie ustawiona na $root.

Jeśli $parent nie jest $root (i prawdopodobnie nie chcesz polegać na this jest inny obiekt, który $root w swoim sposobie na root), wtedy można zrobić coś takiego:

$root.deleteSomeEntity.bind($root, $data, $parent)

W przeciwnym razie na pewno istnieją sposoby upewnienia się, że masz odpowiedni model this w swoim modelu widoku. To zależy od twojej struktury.

+0

Po swoimi sugestiami: http://jsfiddle.net/6MmWs/5/ jednak gdy kliknięcie Delete i funkcja 'self.deleteContactPhone = (viewModel, phone, contact)' viewModel to telefon, telefon to kontakt, a kontakt to także telefon. 'this' jest obecnie modelem viewmodel. – kendaleiv

+1

Chciałbyś, żeby było bardziej jak: http://jsfiddle.net/rniemeyer/6MmWs/6/. Kilka rzeczy, o których warto wspomnieć. 'remove' jest funkcją dostępną w obserwowalnymArray. Zmieniłem twoje tablice 'telefony' tak, aby były obserwowalne, abyś miał je" usuwać "i aktualizował interfejs użytkownika, gdy jeden został usunięty. –

+0

Inną rzeczą jest to, że chcesz, aby twój podpis funkcji był po prostu funkcją (telefon, kontakt). Pierwszym parametrem "bind" jest cel, który służy do kontrolowania wartości 'this' przy uruchomieniu funkcji. Tak więc nie jest to w rzeczywistości argument dla funkcji. –

2

Dlaczego używasz bind()? Domyślnie, jeśli po prostu zapiszesz nazwę funkcji javascript jako zdarzenia kliknięcia Knockout będzie przekazywać $data jako pierwszy argument, a wydarzenie jako drugie.

http://knockoutjs.com/documentation/click-binding.html (Uwaga 1 & 2)

Dlaczego przejmować bind() kiedy można po prostu to zrobić:

data-bind="click: function() {$root.deleteSomeEntity($data, $parent)}" 
+0

Ten kod wydaje się być wykonany bez klikania dla mnie. Znajduje się wewnątrz data-bind = "foreach: ..." jeśli to coś zmieni. – kendaleiv

+0

Oczywiście, że tak! Przepraszam, edytowałem kod, więc funkcja 'function()' jest zawijana wokół wiązania kliknięć. To powinno działać zgodnie z oczekiwaniami. – soniiic

+1

To tylko styl. Wiele osób nie lubi umieszczania anonimowych funkcji w swoich znacznikach. Jest to jedna z rzeczy, która wyłącza ludzi, gdy zaczynają w KO, zwłaszcza gdy są przyzwyczajeni do bardziej dyskretnego podejścia. Działa to dobrze w obu kierunkach, chociaż wolę upewnić się, że "to" jest odpowiednio ustawione w samym modelu widoku. –

Powiązane problemy