2012-05-30 21 views
14

Ive pracuje dla abit z MVC4 SPA, z knockoutJs,wartości przejściu do ko.computed w Knockout JS

Mój problem polega Chcę przekazać wartość do ko.computed. Oto mój kod.

<div data-bind="foreach: firms"> 
<fieldset> 
    <legend><span data-bind="text: Name"></span></legend> 
    <div data-bind="foreach: $parent.getClients"> 
     <p> 
      <span data-bind="text: Name"></span> 
     </p> 
    </div> 
</fieldset> 
</div> 

self.getClients = ko.computed(function (Id) { 
    var filter = Id; 
    return ko.utils.arrayFilter(self.Clients(), function (item) { 
     var fId = item.FirmId(); 
     return (fId === filter); 
    }); 
}); 

Po prostu chcę wyświetlić Firmname jako nagłówek, a następnie pokazać klientów poniżej niego. Funkcja jest wywoływana, ale Id jest niezdefiniowane (ive próbował z „mocnymi” aswell), jeśli zmienię:

var filter = id;  TO  var filter = 1; 

To działa dobrze,

Więc ... Jak przekazać wartość do ko.computed? Nie musi to być Id, może to być również obiekt firmy itp.

Z góry dziękuję.

+0

Id powinien być widoczny na Twoim modelu wyświetlania. Powinieneś po prostu uzyskać do niego dostęp z poziomu obliczonego. – Tyrsius

Odpowiedz

19

Każda firma naprawdę należy zawierający listę klientów, ale można użyć zwykłej funkcji myślę i przekazać go do firmy:

self.getClientsForFirm = function (firm) { 
    return ko.utils.arrayFilter(self.Clients(), function (item) { 
     var fId = item.FirmId(); 
     return (fId === firm.Id()); 
    }); 
}); 

Następnie w html, $ dane jest obecny model, w swojej sprawa firmy:

<div data-bind="foreach: $root.getClientsForFirm($data)"> 
+0

Tankyou !! Właśnie tego potrzebuję :) Ale mam też na uwadze, że powinienem mieć listę klientów od samego początku. – Wondermoose

8

Knockout nie pozwala przekazać niczego do obliczonej funkcji. Nie o to tu chodzi. Zamiast tego możesz użyć zwykłej funkcji, jeśli chcesz.

Inną opcją jest posiadanie danych już w zbiorze danych, w którym wykonano pierwsze foreach. W ten sposób nie używasz $parent.getClients, ale bardziej przypominasz $data.clients.

+0

Nie polecę z tą sugestią, ale jest to coś, co będę miał na myśli w przyszłości, dziękuję za odpowiedź na temat obliczeń. – Wondermoose

+1

bez problemu. Miałem tę samą sugestię w mojej odpowiedzi, ale druga odpowiedź ma przykłady. –

Powiązane problemy