2012-02-14 3 views
5

У меня есть элемент ul, который заполняется посредством привязки шаблона.нокаут шаблон привязки

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

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

Но я хочу первый литий-тег не будет ли-тег из шаблона, но другой один с кнопкой в ​​нем, и он не будет подключен к массиву someElemets. Если я так сделаю

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

тогда li-tag с кнопкой будет последним после рендеринга. Каков наилучший способ решить эту проблему?

ответ

11

Вы можете использовать containerless синтаксис потока управления, Databinding с помощью тегов комментариев. Нет необходимости в шаблоне. 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

Точно. Containerless (html/ko comment) контроль привязок потока идеально подходит для этой ситуации. Вы можете сделать foreach, если, ifnot, with и template в них, не создавая элемент DOM только для KO. –

1

Я не знаю, как легко получить доступ к индексу внутри шаблона. Можно использовать параметры шаблона, как описано в How to use foreach with a special first element?

Ваш код будет что-то вроде:

<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

и если я хочу использовать этот вариант я должен добавить пустой первый элемент массива someElemets? выглядит как чит :) – avgorohov

+0

Вы можете просто заменить {{else}} на {{/ if}} так, чтобы всегда отображался . Я отредактирую свой ответ. –

+0

Один вопрос, возможно, кто-нибудь знает, почему, когда я использую ключевые слова '$ data' и' $ item', шаблон не отображается, но при обращении к элементам, переданным в 'foreach' именами полей ViewModel, все работает нормально, например, я привязывался viewModel с массивом пользователей (с единственным полем 'name'), тогда привязка к' name' работает в шаблоне, но при использовании '$ data' или' $ item' - не может заставить его работать – sll

7

Ниже будет делать это:

<!-- ko template: { name: 'template-name', data: vm } --> <!-- /ko --> 
Смежные вопросы