Eu constantemente me pego usando este idioma em modelos HTML baseados em 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 uma maneira melhor / mais limpa de fazer condicionais em KO, ou há uma abordagem melhor do que apenas usar construções if-else tradicionais?
Além disso, gostaria apenas de salientar que algumas versões do Internet Explorer (IE 8/9) não analisam o exemplo acima corretamente. Por favor, veja esta pergunta do SO para mais informações. O resumo rápido é: não use comentários (ligações virtuais) dentro de tags de tabela para oferecer suporte ao IE. Em tbody
vez disso, use :
<tbody data-bind="if: display"><tr><td>hello</td></tr></tbody>
javascript
knockout.js
Jensen Ching
fonte
fonte
Respostas:
Existem algumas maneiras diferentes de lidar com esse tipo de código.
com uma combinação if / ifnot como você está agora. Isso funciona bem e não é muito prolixo.
A vinculação de switch / case de Michael Best ( https://github.com/mbest/knockout-switch-case ) é bastante flexível e pode permitir que você lide facilmente com isso e com outros mais complicados (mais estados do que verdadeiro / falso).
Outra opção é usar modelos dinâmicos. Você vincularia uma área a um ou mais modelos com o nome do modelo sendo usado com base em um observável. Aqui está um post que escrevi sobre esse tópico há algum tempo: http://www.knockmeout.net/2011/03/quick-tip-dynamically-changing.html . Em seu cenário, pode ser assim:
A
getCellTemplate
função poderia residir em qualquer lugar, mas receberia o item ($ data) como o primeiro argumento e retornaria o nome do modelo a ser usado.fonte
propertyName
, você pode determinar dinamicamente o nome do modelo.Uma abordagem é usar modelos nomeados (que podem suportar a passagem de argumentos):
Outra opção é usar meu plug-in switch / case , que funcionaria assim:
fonte
Para evitar o recálculo da ligação knockout ao usar a combinação de if: / ifnot: você pode usá-los em conjunto com a construção 'with:'
fonte
Agora existe também o
knockout-else
binding / plugin (que escrevi para resolver esse problema).fonte