2012-02-14 8 views
5

Ho un elemento ul che viene riempito tramite associazione modello.rilegatura templatura modello

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

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

Ma io voglio il primo li-tag non sarebbe li-tag dal modello, ma un altro con il tasto in esso e non sarà collegato a someElemets array. Se lo faccio in questo modo

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

quindi il tag li con il pulsante sarà l'ultimo dopo il rendering. Qual è il modo migliore per risolvere questo problema?

risposta

11

È possibile utilizzare la sintassi del flusso di controllo containerless, associazione dati utilizzando tag di commento. Non c'è bisogno di un modello. 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

Esattamente. Il controllo senza contenitore (html/ko comment) dei binding di flusso è l'ideale per questa situazione. Puoi fare foreach, if, ifnot, with e template in loro senza dover creare un elemento DOM solo per KO. –

1

Non sono a conoscenza di un modo semplice per accedere all'indice quando si è all'interno di un modello. È possibile utilizzare le opzioni modello, come descritto in How to use foreach with a special first element?

Il tuo codice sarebbe qualcosa di simile:

<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

e se voglio usare quella variante che dovrebbe aggiungere primo elemento vuoto alla matrice someElemets? sembra un imbroglio :) – avgorohov

+0

Puoi semplicemente sostituire {{else}} con {{/ if}} in modo che lo sia sempre visualizzato. Modificherò la mia risposta. –

+0

Una domanda, forse qualcuno sa perché quando sto usando '$ data' e' $ item' keywords - il template non è reso, ma quando si accede agli elementi passati in 'foreach' dai nomi dei campi ViewModel - tutto funziona bene, ad esempio ho legato viewModel con array di utenti (con un singolo campo 'name'), quindi il collegamento a' name' funziona nel template, ma quando si usa '$ data' o' $ item' - non riesco a farlo funzionare – sll

7

Di seguito lo farà:

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