Я использую этот обработчик для получения интеграции с датой + +:
ko.bindingHandlers.dataTablesForEach = {
page: 0,
datatable: null,
oninit: true,
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
let binding = ko.utils.unwrapObservable(valueAccessor());
ko.unwrap(binding.data);
if (binding.options.paging) {
binding.data.subscribe(function (changes) {
var table = ko.bindingHandlers.dataTablesForEach.datatable
ko.bindingHandlers.dataTablesForEach.page = table.page();
table.destroy();
}, null, 'arrayChange');
}
let nodes: any = Array.prototype.slice.call(element.childNodes, 0);
ko.utils.arrayForEach(nodes, function (node: any) {
if (node && node.nodeType !== 1) {
node.parentNode.removeChild(node);
}
});
return ko.bindingHandlers.foreach.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
},
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
let binding = ko.utils.unwrapObservable(valueAccessor()),
key = 'DataTablesForEach_Initialized';
ko.unwrap(binding.data);
let table;
if (!binding.options.paging) {
table = ko.bindingHandlers.dataTablesForEach.datatable;
table.destroy();
}
ko.bindingHandlers.foreach.update(element, valueAccessor, allBindings, viewModel, bindingContext);
ko.bindingHandlers.dataTablesForEach.datatable = $(element).closest('table').TriqsTable(false, true);
table = ko.bindingHandlers.dataTablesForEach.datatable;
if (ko.bindingHandlers.dataTablesForEach.oninit == true) {
ko.bindingHandlers.dataTablesForEach.datatable.on('page.dt', function () {
let datatable = ko.bindingHandlers.dataTablesForEach.datatable;
if (datatable != null) {
let currentpageindex: any = datatable.page();
localStorage.setItem(element.id, currentpageindex);
}
});
ko.bindingHandlers.dataTablesForEach.oninit = false;
}
if (binding.options.paging) {
let pagesinfo: DataTables.PageMethodeModelInfoReturn = table.page.info();
let pagesamount = pagesinfo.pages - 1; // to get the index
let currentpageindex = localStorage.getItem(element.id);
if (currentpageindex != null) {
let currentpagenumber = Number(currentpageindex);
if (currentpagenumber <= pagesamount) {
ko.bindingHandlers.dataTablesForEach.page = currentpagenumber;
}
else {
ko.bindingHandlers.dataTablesForEach.page = 0;
}
table.page(ko.bindingHandlers.dataTablesForEach.page).draw(false);
}
}
if (!ko.utils.domData.get(element, key) && (binding.data || binding.length)) {
ko.utils.domData.set(element, key, true);
}
return {
controlsDescendantBindings: true
};
}
};
Все работает хорошо, за исключением случаев, когда я обновляю свойство (наблюдаемое и нет) внутри массива Knockout Observable, который не на текущей странице данных. Можно ли сделать это? У меня есть несколько функций, которые обновляют каждую строку, видимую или нет.
Значение обновляется в модели (как видно из Watch), но не в представлении.
Редактировать:
Пример того, как я бы обновил значения:
model.Records().forEach( x => x.Selected(true));