Constantemente me encuentro usando este idioma en plantillas HTML basadas en KO:
<!-- 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 forma mejor / más limpia de hacer condicionales en KO, o hay un enfoque mejor que simplemente usar las construcciones tradicionales if-else?
Además, me gustaría señalar que algunas versiones de Internet Explorer (IE 8/9) no analizan correctamente el ejemplo anterior. Consulte esta pregunta SO para obtener más información. El resumen rápido es que no use comentarios (enlaces virtuales) dentro de las etiquetas de la tabla para admitir IE. Utilice en su tbody
lugar:
<tbody data-bind="if: display"><tr><td>hello</td></tr></tbody>
javascript
knockout.js
Jensen Ching
fuente
fuente
Respuestas:
Hay un par de formas diferentes de manejar este tipo de código.
con una combinación si / si no como lo es ahora. Esto funciona bien y no es muy detallado.
El enlace de interruptor / caso 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 utilizar plantillas dinámicas. Uniría un área a una o más plantillas con el nombre de la plantilla que se usa según un 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, podría verse así:
La
getCellTemplate
función podría vivir en cualquier lugar, pero se le daría el elemento ($ data) como primer argumento y devolvería el nombre de la plantilla a usar.fuente
propertyName
, puede determinar dinámicamente el nombre de la plantilla.Un enfoque es utilizar plantillas con nombre (que pueden admitir el paso de argumentos):
Otra opción es usar mi complemento switch / case , que funcionaría así:
fuente
Para evitar que se vuelva a calcular el enlace de nocaut cuando se usa una combinación de if: / ifnot: puede usarlos junto con la construcción 'with:'
fuente
Ahora también existe el
knockout-else
enlace / complemento (que escribí para abordar este problema).fuente