2012-01-10 13 views

Respuesta

14

Existen varias formas de hacerlo. Demostré 2 maneras en los violines que se muestran aquí: http://jsfiddle.net/njj2P/2/

La primera opción que mostré es usar un ko.computado para determinar si el nombre debe ser devuelto en singular o en plural, basado en una evaluación.

this.formattedName = ko.computed(function() { 
     return this.qty() > 1 ? this.name() + "s" : this.name(); 
    }, this); 

La segunda opción muestra cómo hacer esto sin una propiedad calculada, y en su lugar mediante el uso de una unión condicional.

<span data-bind="if:qty()>1">s</span> 
+0

Realmente estoy buscando una manera limpia de hacer "y" a "ies" o "x" a "ces", etc. Esta parte es algo fácil. Subí de todos modos, pero no es lo que quiero. ¿Algunas ideas? ¿Hay algo por ahí? – vbullinger

+0

Volví a subir esta respuesta porque utilicé la segunda opción, con un ligero cambio a! = En lugar de> para que un valor de cero muestre la s (es decir, O subelementos, 1 subelemento, 2 subelementos) – MikeScott8

+0

Estoy de acuerdo e hice la misma observación y cambio a mi código. – GenuineRex

12

Puede crear un enlace personalizado reutilizable como el siguiente.

ko.bindingHandlers.pluralize = { 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
    function count(data) { 
     var value = ko.utils.unwrapObservable(data); 
     if (typeof value === "object" && value.length > 0) { 
      return value.length; 
     } else if (typeof value === "number") { 
      return value; 
     } 
    } 

    var settings = valueAccessor(); 
    var text = count(settings.data) === 1 ? settings.singular : settings.plural; 
    $(element).text(ko.utils.unwrapObservable(text)); 
    } 
}; 

Lo usaría así.

<span data-bind="pluralize: { data:items, singular:'entry', plural:'entries' }"></span> 
  • La opción data puede apuntar a cualquier matriz o número.
  • La opción singular representa el texto que desea mostrar si data evalúa a 1
  • La opción plural representa el texto que se mostrará lo contrario.

Véalo en acción aquí. http://fiddle.jshell.net/jessegavin/wamfw/

+1

Me gusta bastante esta solución en realidad. – jaffa

+2

¡Gran respuesta! Recomiendo agregar una opción 'ninguno' y una referencia retrospectiva al 'conteo 'para que un desarrollador pueda obtener opciones tales como'' none '=> "Sin elementos",' singular '=> "1 elemento",' plural '=> "## elementos" ' –

+0

Buena idea. Eso es lo que hace Angular. – jessegavin

Cuestiones relacionadas