Я пытаюсь динамически создавать и фильтровать мобильную группу управления jquery, содержащую флажки с использованием привязки нокаута. Основная идея заключается в том, что пользователь выбирает параметр, который фильтрует список флажков в контрольной группе. Я видел подобные вопросы здесь, но все они кажутся одноразовыми, где когда-то привязанные ko и усиленные jqm, они остаются неизменными. У меня такое поведение работает, проблема возникает, когда базовый viewModel изменяется, а ko обновляет список флажков в группе управления. Полную демонстрацию поведения можно найти на jsfiddle здесь: http://jsfiddle.net/hkrauss2/JAvLk/15/Динамическая группа управления флажком с использованием jQuery mobile и нокаутом
Я вижу, что проблема связана с тем, что jqm создает оболочку div при увеличении контрольной группы. Затем Ko добавляет новые элементы над оберткой div при обновлении DOM. В основном я спрашиваю, разрешил ли кто-либо эту проблему, а также если кто-то думает, что я прошу проблемы, интегрируя эти две библиотеки? Спасибо всем заранее.
Вот Html:
<div id="home" data-role="page">
<div data-role="header">
<h2>Knockout Test</h2>
</div>
<div data-role="content">
<ul id="parent-view" data-role="listview" data-inset="true" data-bind="foreach: parentCategories">
<li><a href="#list" data-transition="slide" data-bind="text: description, click: $parent.OnClick"></a></li>
</ul>
<p>
To reproduce the issue select Restaurants, come back and select Nightlife or Bars
</p>
</div>
</div>
<div id="list" data-role="page">
<div data-role="header">
<h2>Knockout Test</h2>
<a data-rel="back" data-icon="carat-l" data-iconpos="notext">Back</a>
</div>
<div data-role="content">
<form>
<div id="child-view" data-role="controlgroup" data-bind="foreach: childCategories, jqmRefreshControlGroup: childCategories">
<input type="checkbox" name="checkbox-v-2a" data-bind="attr: {id: 'categoryId' + id}" />
<label data-bind="text: description, attr: {for: 'categoryId' + id}" />
</div>
</form>
</div>
</div>
И основной JavaScript. Обратите внимание, что здесь нет двух внешних js-файлов. Один устанавливает $.mobile.autoInitializePage = false;
на событие mobileinit. Другая информация вводится в виде массива JSON, который используется для инициализации свойства Categories в AppViewModel.
// Custom binding to handle jqm refresh
ko.bindingHandlers.jqmRefreshControlGroup = {
update: function (element, valueAccessor) {
ko.utils.unwrapObservable(valueAccessor());
try {
$(element).controlgroup("refresh");
} catch (ex) { }
}
}
function GetView(name) {
return $(name).get(0);
}
// Define the AppViewModel
var AppViewModel = function() {
var self = this;
self.currentParentId = ko.observable(0);
self.Categories = ko.observableArray(Categories); // Categories comes from sampledata.js
self.parentCategories = ko.computed(function() {
return ko.utils.arrayFilter(self.Categories(), function (item) {
return item.parentId == 0;
});
});
self.childCategories = ko.computed(function() {
return ko.utils.arrayFilter(self.Categories(), function (item) {
return item.parentId == self.currentParentId();
});
});
self.OnClick = function (viewModel, $event) {
self.currentParentId(viewModel.id);
return true;
};
};
// Create the AppViewModel
var viewModel = new AppViewModel();
// Apply bindings and initialize jqm
$(function() {
ko.applyBindings(viewModel, GetView('#parent-view'));
ko.applyBindings(viewModel, GetView('#child-view'));
$.mobile.initializePage();
});
Фантастический! Спасибо – hkrauss2
@ user3175121 добро пожаловать. Это исправление, но я работаю над лучшим решением, проверяя это http://jsfiddle.net/Palestinian/Q44Fy/. В моем ответе каждый флажок завернут в _ui-controlgroup-control_, который я не хочу быть. Я хочу, чтобы один div обернул все элементы внутри. – Omar