Datatable Knockout JS на скрытой странице не обновляется - PullRequest
0 голосов
/ 04 марта 2020

Я использую этот обработчик для получения интеграции с датой + +:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...