2012-05-30 12 views
14

Ive lavorato per un po 'nervosa con MVC4 SPA, con knockoutJs,valori Passando alla ko.computed in Knockout JS

Il mio problema è che voglio passare un valore ad un ko.computed. Ecco il mio codice.

<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); 
    }); 
}); 

Voglio semplicemente visualizzare Firmname come intestazione, quindi mostrare i client sotto di esso. La funzione viene chiamata, ma Id è indefinito (Ive ha provato con 'Studio' lontato), se cambio:

var filter = id;  TO  var filter = 1; 

Funziona bene,

Quindi ... Come si fa a passare un valore a un ko.computed? Non ha bisogno di essere l'Id, può anche essere l'oggetto Firm ecc.

Grazie in anticipo.

+0

L'ID dovrebbe essere un osservabile sul tuo modello view. Dovresti semplicemente accedervi dall'interno del calcolo. – Tyrsius

risposta

19

Ogni impresa in realtà dovrebbe essere contenente un elenco di clienti, ma è possibile utilizzare una funzione regolare penso e passarlo l'azienda:

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

Poi in html, $ dati è il modello attuale, nella vostra Caso l'azienda:

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

Tankyou !! Questo è proprio quello di cui ho bisogno :) Ma ho anche in mente che dovrei avere i clienti in una lista fin dall'inizio. – Wondermoose

8

Knockout non consente di passare nulla a una funzione calcolata. Non è quello per cui è. Potresti invece usare una funzione regolare lì se lo desideri.

Un'altra opzione è quella di avere i dati già nel set di dati su cui è stato eseguito il primo foreach. In questo modo, non usi $parent.getClients, ma più come $data.clients.

+0

Non sono d'accordo con questo suggerimento, ma è qualcosa che avrò in mente per il futuro, grazie per la risposta sul calcolo. – Wondermoose

+1

nessun problema. Ho avuto lo stesso suggerimento nella mia risposta, ma l'altra risposta ha degli esempi. –

Problemi correlati