Я знаю, что есть много вопросов, которые охватывают интеграцию jquery mobile/knockoutjs, однако я не смог найти нить, которая решила мою проблему. У меня есть модель представления мастер, который содержит вид ребенка модели, и поэтому я инициализировать это на странице загрузки, поскольку это событие только обстреливали приложения нагрузки:Инициализация содержимого knockoutjs в дочерней jquery mobile page
var viewModel = null;
$(function() {
console.debug("running init");
viewModel = new ViewModel();
ko.applyBindings(viewModel);
});
Это прекрасно работает на первой странице моего приложения, однако когда я перехожу на дочернюю страницу, содержимое knockoutjs не появляется, потому что jquery mobile загружает html динамически, а нокаут не знает, обновлять связанный контент. Я пытаюсь сказать, чтобы он динамически обновлялся с помощью функции $(document).delegate
, однако я боюсь того, как она должна быть реализована.
<ul id="speeding" data-role="listview" data-bind="foreach: speeding.items">
<li>
<h3 class="ui-li-heading" data-bind="text: Address"></h3>
<p class="ui-li-desc" data-bind="text: Address2"></p>
<p class="ui-li-desc" data-bind="text: PrettyDate"></p>
<p class="ui-li-aside" data-bind="text: SpeedMph"></p>
</li>
<script type="text/javascript">
var loaded = false;
$(document).delegate("#page-speeding", "pagebeforecreate", function() {
if (!loaded) {
loaded = true;
ko.applyBindings(viewModel);
}
else {
$("#speeding").trigger("refresh");
}
});
</script>
</ul>
Я помещаю функции делегата в пределах страницы его называют на, по-видимому, как это требование с помощью делегата. Затем при первой загрузке этой дочерней страницы я вызываю ko.applyBindings (я только хотел вызвать это при загрузке приложения, но я не смог получить триггер («создать») для работы. При последующих вызовах он вызывал бы trigger («refresh») (что не работает для меня.) Проблема заключается в том, что функция делегата добавляется каждый раз, когда я перехожу на дочернюю страницу. Поэтому при первой загрузке дочерней страницы он будет вызывать функцию обратного вызова делегата один раз. вернуться на главную страницу, а затем обратно на страницу ребенка, он будет вызывать делегат обратного вызова дважды, и так далее.
Может кто-то пожалуйста, дать указания рекомендуемого подхода к обновив knockoutjs привязок на дочерних страниц?
У меня было много проблем с использованием нокаута с jQM и в конечном итоге не использовал его вообще. Но я решил эту конкретную точку, назначив id каждой странице и передав элемент dom в качестве параметра для нокаута, например. 'ko.applyBindings (viewModel, $ (" # mypage div: jqmData (role = 'content') [0]) '. http://stackoverflow.com/questions/7342814/knockoutjs-ko-applybindings-to-partial- view – jgillich
Сначала используйте '$ ('# speeding'). listview ('refresh')' и замените '.delegate' на' .on' – Omar
@Omar - если я делаю $ (document) .on ("# page- speeding "," pagebeforecreate ", function() {}), тогда функция вообще не вызывается ... – Justin