2012-05-30 11 views
14

he estado trabajando durante un poco con MVC4 SPA, con knockoutJs,Pasar valores a ko.computed en Knockout JS

Mi problema es que quiero pasar un valor a un ko.computed. Aquí está mi código.

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

Simplemente quiero mostrar el nombre de la empresa como un encabezado, luego mostrar los clientes debajo de él. La función se llama, pero no está definido Id (He intentado con aswell 'firme'), si cambio:

var filter = id;  TO  var filter = 1; 

Funciona bien,

Entonces ... ¿Cómo pasar un valor a un ko.computado? No necesita ser el Id, también puede ser el objeto Firme, etc.

Gracias de antemano.

+0

Id debe ser observable en su modelo de vista. Solo debe acceder desde dentro de la calculada. – Tyrsius

Respuesta

19

Cada empresa realmente debe ser contiene una lista de clientes, pero se puede usar una función regular que pienso y pasarlo a la empresa:

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

Luego, en html, $ datos es el modelo actual, en su caso de la empresa:

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

Tankyou !! Esto es justo lo que necesito :) Pero también tendré en mente que debería tener los Clientes en una lista desde el principio. – Wondermoose

8

Knockout no le permite pasar nada a una función calculada. Eso no es para lo que es. En su lugar, puede utilizar una función normal allí si lo desea.

Otra opción es tener los datos ya en el conjunto de datos en el que hizo el primer foreach. De esta forma, no usa $parent.getClients, sino más bien como $data.clients.

+0

No voy a ir con esta sugerencia atm, pero es algo que tendré en cuenta para el futuro, gracias por la respuesta sobre computed. – Wondermoose

+1

no hay problema. Tuve la misma sugerencia en mi respuesta, pero la otra respuesta tiene ejemplos. –

Cuestiones relacionadas