2012-01-15 19 views
18

¿Cómo puedo controlar que foreach ignore ciertos elementos usando una comparación?Knockout.js foreach: pero solo cuando la comparación es verdadera

Lo que yo quiero, por ejemplo, es algo como esto:

<div data-bind="foreach: entry where (entry.number > 10)"> 

Así que lo que yo quiero que haga es recorrer entry 's pero sólo se ejecuta cuando esa corriente entry tiene un valor number de más de 10

¿Es esto posible?

Respuesta

23

Actualmente no es posible con knockout.js, pero es una característica interesante. Debe presentar un informe de error/contactar al autor para considerarlo para una versión futura.

Camino 1:

<div data-bind="foreach: entry"> 
    <div data-bind="if: entry.number > 10"></div> 
</div> 

manera 2:
escribir un método de filtro personalizado que le brinda una serie de elementos que coinciden con sus condiciones y utilizar esto en su foreach.

+0

Seguí ** Camino 1 **, antes de su respuesta, como una alternativa, supongo que me apegaré a ella. ¡Gracias! – LouwHopley

+0

No hay problema, lo sabía como es la forma habitual, pero lo incluía de todos modos: D –

17

probar esto:

<div data-bind="foreach: editingItem.columns"> 
     <!-- ko if: Selected--> 
     <div data-bind="text: Name"></div> 
      <input type="text"/> 
      <!-- /ko --> 
+0

Hola, Justo, buena respuesta No vi el al principio, hasta que lo hice alguna investigación. Es importante tener en cuenta que si el enlace puede funcionar dentro de un comentario. http://knockoutjs.com/documentation/if-binding.html También podría ser una buena idea modificar tu respuesta para que se aplique específicamente a la pregunta, p. use "entry.number" de esa manera para que sea más fácil ver cómo se aplica para resolver el problema. –

+0

Gracias @AlexKey Soy nuevo en KnockoutJS y fui a través de los tutoriales y son muy útiles. – JustMe

+0

Perfecto para filtrar filas de tablas. – Rake36

4

¿Qué hay de

<div data-bind="foreach: _.filter(entry(), function(item) { return item.number > 10;})"> 

utilizando underscore.js

+0

¡Agradable! Underscore es da-bomb – skrile

6

Creo que sería mejor utilizar el construido en el método arrayFilter (ver http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html)

viewModel.filteredEntries = ko.computed(function() { 

    return ko.utils.arrayFilter(this.entries(), function(item) { 
     return item.number > 10; 
    }); 

}, viewModel); 

Luego puede simplemente enlazar datos a las entradas filtradas como lo haría normalmente

Cuestiones relacionadas