2012-07-19 6 views
92

constantemente me encuentro utilizando este idioma en las plantillas HTML basado en KO:Cómo plantillas de estructuras If-Else en vistas enlazadas a datos?

<!-- ko if: isEdit --> 
<td><input type="text" name="email" data-bind="value: email" /></td> 
<!-- /ko --> 
<!-- ko ifnot: isEdit --> 
<td data-bind="text: email"></td> 
<!-- /ko --> 

¿Existe una manera mejor/más limpio que hacer condicionales en KO, o hay una mejor enfoque que simplemente usar tradicional construcciones if-else?

Además, me gustaría señalar que algunas versiones de Internet Explorer (IE 8/9) no analizan correctamente el ejemplo anterior. Por favor, consulte this SO question para obtener más información. El resumen rápido es, no use comentarios (enlaces virtuales) dentro de etiquetas de tabla para soportar IE. Usar la tbody lugar:

<tbody data-bind="if: display"><tr><td>hello</td></tr></tbody> 
+0

Cualquier persona que mire esto puede desear seguir https://github.com/knockout/knockout/issues/962 –

Respuesta

62

Existen dos formas diferentes de manejar este tipo de código.

  • con una combinación if/ifnot como usted ahora. Esto funciona bien y no es terriblemente detallado.

  • El encuadernado del conmutador/caja de Michael Best (https://github.com/mbest/knockout-switch-case) es bastante flexible y puede permitirle manejar fácilmente esto y otros más complicados (más estados que verdadero/falso).

  • Otra opción es usar plantillas dinámicas. Debería vincular un área a una o más plantillas con el nombre de la plantilla que se utiliza en función de un elemento observable. Aquí hay una publicación que escribí sobre este tema hace un tiempo: http://www.knockmeout.net/2011/03/quick-tip-dynamically-changing.html. En su escenario, que podría ser:

<td data-bind="template: $root.getCellTemplate"></td> 

<script id="cellEditTmpl" type="text/html"> 
    <input type="text" name="email" data-bind="value: email" /> 
</script> 

<script id="cellTmpl" type="text/html"> 
    <span data-bind="text: email"></span> 
</script> 

La función getCellTemplate podía vivir donde quiera, pero se le daría el elemento (datos $) como primer argumento y devolvería el nombre de la plantilla a utilizar .

+0

extraño, mi HTML no aparecerá. También me acabo de dar cuenta de que Michael dio casi la misma respuesta. –

+0

Gracias por una lista completa de opciones. Supongo que mi estilo de código original funciona para casos simples. Veré las otras opciones cuando surja la necesidad. –

+0

hay una manera de personalizar aún más la plantilla, como "template: data, proppertyName: 'email'" y en la plantilla data-bind = "text: $ data [propertyName]". –

40

Un método consiste en utilizar las plantillas con nombre (que puede soportar pasar argumentos):

<!-- ko template: isEdit() ? 'emailEdit' : 'emailDisplay' --><!-- /ko --> 
<script id="emailEdit" type="text/html"> 
    <td><input type="text" name="email" data-bind="value: email" /></td> 
</script> 
<script id="emailDisplay" type="text/html"> 
    <td data-bind="text: email"></td> 
</script> 

Otra opción es usar mi switch/case plugin, que funcionaría así:

<!-- ko switch --> 
    <!-- ko case: isEdit --> 
     <td><input type="text" name="email" data-bind="value: email" /></td> 
    <!-- /ko --> 
    <!-- ko case: $else --> 
     <td data-bind="text: email"></td> 
    <!-- /ko --> 
<!-- /ko --> 
+0

Gracias. Tendré en cuenta el plugin de cambio/caso para cuando surja la necesidad. –

+2

¡Buen plugin que tienes allí! Lo usaré seguro. – Kukks

+0

Las plantillas con nombre funcionan muy bien, y admite if elseif elseif else escriba escenarios anidando el operador de ternario. – Will

4

Para evitar un nuevo cálculo del nocaut vinculante cuando se utiliza la combinación de si:/ifnot: se puede usar en conjunción con 'con:' construcción

<!-- ko with: $data.DoSomePerformanceCriticalWork($data.SomeParameter()) --> 
     <!-- ko if: $data.Condition() --> 
      ... some markup ... 
     <!-- /ko --> 
     <!-- ko ifnot: $data.Condition() --> 
      ... some markup ... 
     <!-- /ko --> 
    <!-- /ko --> 
1

En la actualidad existe también la knockout-else unión/plugin (que yo escribió para abordar este problema).

Cuestiones relacionadas