Привязка данных не работает с шаблонами, установленными программно из JavaScript

#knockout.js #jquery-templates

#knockout.js #jquery-шаблоны

Вопрос:

Я новичок в KnockOut JS, и я не могу найти причину, по которой привязка данных не работает при использовании jQuery text / x-jquery-tmpl.

Использование: jQuery 1.5.2; нокаут 1.3.0 бета

Я пытаюсь привязать неупорядоченный список к наблюдаемому массиву в модели представления и привязать флажки на объектах элементов списка к другому массиву ko.observble с привязкой ‘checked’.

Рабочий код шаблона:

 <ul data-bind="foreach: viewModel.booksFromServer()">
  <li>
    <input type="checkbox" data-bind="checked: viewModel.selectedBooks(), value: Id" />
  </li>
</ul>
  

Это не работает, т.Е. Отображается список, но выбранные значения не сохраняются в массиве:

 <script type=""text/x-jquery-tmpl" id="bookTemplate">
  {{each data}}
    <li> 
      <input type="checkbox" value="${Id}" data-bind="checked: selectedBooks" />
    </li>
  {{/each}}
</script>
  

В модели представления у меня есть:

 var viewModel ={
  selectedBooks = ko.observableArray(),
  booksFromServer = ko.observableArray()
  //other properties and methods
  showBookList: function(bookList){
    $("#bookTemplate").tmpl({data: bookList}).appendTo("#book_list");
  }
}
  

Что вы думаете? Заранее благодарю вас за помощь.
Piotr

Комментарии:

1. если шаблон 1 работает, почему вы хотите, чтобы шаблон 2 работал из интереса? Шаблон 1, который работает, — это новый способ сделать это, который был представлен в бета-версии.

2. Это было просто из любопытства. Мне было интересно, делаю ли я что-то неправильно или это просто неправильный подход. Ответ Р.П. Нимайера: «он не будет выполнять привязку данных или очищать какие-либо существующие привязки» разрешил мои сомнения.

Ответ №1:

При использовании шаблонов jQuery в Knockout вам никогда не захочется вызывать .tmpl напрямую, поскольку он не будет выполнять привязку данных или очищать какие-либо существующие привязки.

Вы хотели бы использовать template привязку: http://knockoutjs.com/documentation/template-binding.html .

При вызове showBookList вы можете заполнить observableArray, который связан с использованием привязки шаблона, и ваш пользовательский интерфейс будет соответствующим образом обновлен. Таким образом, ваша модель представления действительно работает только с данными и не зависит от структуры вашего пользовательского интерфейса (никаких ссылок на селекторы или элементы jQuery в коде модели представления).

Комментарии:

1. Спасибо за ваше объяснение. Я представляю фреймворк Knockout для существующего проекта, поэтому я подумал, что могу просто оставить большие куски нетронутыми и при необходимости вводить биты KO.