2012-02-14 9 views
5

Tengo un elemento ul que se rellena mediante el enlace de la plantilla.plantilla de knockout vinculante

<script type="text/html" id="someTemplate"> 
<li> 
    <span data-bind="text: someText"> 
</li> 
</script> 

<ul data-bind="template: {foreach: someElemets, name: 'someTemplate'}"> 
</ul> 

Pero quiero la primera li-etiqueta no sería li-etiqueta de plantilla, pero otra con botón en él y no va a ser conectados a la matriz someElemets. Si lo hago de esa manera

<ul data-bind="template: {foreach: someElemets, name: 'someTemplate'}"> 
    <li><button data-bind=click: doSomething">Click me</button></li> 
</ul> 

entonces li-tag con el botón será el último después del renderizado. ¿Cuál es la mejor manera de resolver ese problema?

Respuesta

11

Puede utilizar la sintaxis de flujo de control sin contenedor, enlace de datos utilizando etiquetas de comentario. No hay necesidad de una plantilla. more info

<ul>  
    <li><button data-bind=click: doSomething">Click me</button></li> 
    <!-- ko foreach: someElemets-->   
    <li> 
     <span data-bind="text: someText"></span> 
    </li>  
    <!-- /ko --> 
</ul> 
+0

Exactamente. El control sin contenedor (comentario html/ko) de las uniones de flujo es ideal para esta situación. Puede hacer foreach, if, ifnot, with y template en ellos sin tener que crear un elemento DOM solo para KO. –

1

No conozco una manera fácil de acceder al índice cuando se encuentra dentro de una plantilla. Se podría utilizar opciones de la plantilla como se describe en How to use foreach with a special first element?

Su código sería algo así como:

<ul data-bind="template: { name: 'someTemplate', foreach: someElemets, templateOptions: { first: someElemets()[0]} }"> 
</ul> 

<script id="someTemplate" type="text/html"> 
    <li> 
    {{if $item.first === $data}} 
     <button data-bind="click: doSomething">Click me</button> 
    {{/if}} 
    <span data-bind="text: someText"> 
    </li> 
</script> 
+0

y si quiero usar esa variante debo añadir primer elemento vacío a la matriz someElemets? parece un truco :) – avgorohov

+0

Puedes simplemente reemplazar el {{else}} con {{/ if}} para que siempre se represente el . Editaré mi respuesta. –

+0

Una pregunta, quizás alguien sepa por qué cuando uso palabras clave '$ data' y' $ item' - la plantilla no se representa, pero al acceder a los elementos pasados ​​en 'foreach' por los nombres de campo ViewModel - todo funciona bien, por ejemplo, me limito viewModel con una matriz de usuarios (con un solo campo 'name'), luego vinculando al trabajo' name' en la plantilla, pero al usar '$ data' o' $ item' - no puede hacerlo funcionar – sll

7

El siguiente lo hará:

<!-- ko template: { name: 'template-name', data: vm } --> <!-- /ko -->