Динамически изменять локализацию таблицы DataTables.net - PullRequest
0 голосов
/ 16 октября 2019

Я использую Angular 7 с оболочкой Angular DataTables для DataTables.net, созданной l-lin. У меня была задача динамического обновления локализации таблицы без воссоздания самой таблицы. На самом деле я нашел ответ, как это сделать, но я не хотел отступать слишком далеко от интерфейсов Angular DataTables. Итак, я написал следующий угловой сервис. Я хочу поделиться своим решением проблемы и был бы рад, если бы кто-то поделился лучшим решением.

1 Ответ

0 голосов
/ 16 октября 2019

Услуга:

import { Injectable } from '@angular/core';

import { DataTableDirective } from 'angular-datatables';

@Injectable()
export class DataTablesHelpersService {
    public createDataTablesLanguageObject(
        localizationResources: any
    ): DataTables.LanguageSettings {
        return {
            emptyTable: localizationResources['dt_sEmptyTable'],
            info: localizationResources['dt_sInfo'],
            infoEmpty: localizationResources['dt_sInfoEmpty'],
            infoFiltered: localizationResources['dt_sInfoFiltered'],
            infoPostFix: localizationResources['dt_sInfoPostFix'],
            thousands: localizationResources['dt_sInfoThousands'],
            lengthMenu: localizationResources['dt_sLengthMenu'],
            loadingRecords: localizationResources['dt_sLoadingRecords'],
            processing: localizationResources['dt_sProcessing'],
            search: localizationResources['dt_sSearch'],
            searchPlaceholder: localizationResources['dt_sSearchPlaceholder'],
            zeroRecords: localizationResources['dt_sZeroRecords'],
            paginate: {
                first: localizationResources['dt_oPaginate_sFirst'],
                last: localizationResources['dt_oPaginate_sLast'],
                next: localizationResources['dt_oPaginate_sNext'],
                previous: localizationResources['dt_oPaginate_sPrevious']
            },
            aria: {
                sortAscending: localizationResources['dt_oAria_sSortAscending'],
                sortDescending:
                    localizationResources['dt_oAria_sSortDescending'],
                paginate: {
                    first: localizationResources['dt_oAria_oPaginate_sFirst'],
                    last: localizationResources['dt_oAria_oPaginate_sLast'],
                    next: localizationResources['dt_oAria_oPaginate_sNext'],
                    previous:
                        localizationResources['dt_oAria_oPaginate_sPrevious']
                }
            }
        };
    }

    public updateDtLocalization(
        dataTableDirective: DataTableDirective,
        localizationResources: any
    ) {
        dataTableDirective.dtInstance.then((dataTable: DataTables.Api) => {
            // Get table settings.
            const dataTableSettings = dataTable.settings();

            // Get existing DataTables localization object.
            const existingDtLocalizationObject = dataTableSettings[0].oLanguage;

            // Create DataTables localization object using new localization resources.
            const newDtLocalizationData = this.createDataTablesLanguageObject(
                localizationResources
            );

            // Recursively copy fields from a new localization object to an existing
            // localization object used by the table.
            this.updateDtLocalizationObject(
                existingDtLocalizationObject,
                newDtLocalizationData
            );

            // Redraw the table to update the text.
            dataTable.draw('full-hold');
        });
    }

    public updateDtLocalizationObject(
        existingDtLocalizationObject: DataTables.LanguageSettings,
        newLocalizationDataSource: DataTables.LanguageSettings
    ) {
        this.copyValuesFromSourceToDestinationRecursive(
            newLocalizationDataSource,
            existingDtLocalizationObject
        );
    }

    private copyValuesFromSourceToDestinationRecursive(
        source: any,
        destination: any
    ) {
        for (var field in source) {
            let mappedField: string;
            if (destination._hungarianMap) {
                mappedField = destination._hungarianMap[field];
            }

            if (typeof source[field] === 'object') {
                this.copyValuesFromSourceToDestinationRecursive(
                    source[field],
                    destination[field]
                );
                if (mappedField) {
                    this.copyValuesFromSourceToDestinationRecursive(
                        source[field],
                        destination[mappedField]
                    );
                }
            } else {
                destination[field] = source[field];
                if (mappedField) {
                    destination[mappedField] = source[field];
                }
            }
        }
    }
}

В компоненте с таблицей:

import { DataTableDirective } from 'angular-datatables';

...

@ViewChild(DataTableDirective) private datatableElement: DataTableDirective;

...

constructor(
    ...
    private dataTablesHelpersService: DataTablesHelpersService,
    ...
) { }

...

private someMethod() {
    if (this.datatableElement) {
        // Pass the table and your new object with localization resources to the method.
        // This example uses a simple POJO key-value format object as an object
        // with localization resources for the entire application.
        this.dataTablesHelpersService.updateDtLocalization(
            this.datatableElement,
            yourResourcesObject
        );
    }
}

...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...