Попытка создать сервис для создания моего NgTable - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь создать сервис, который возвращает мне NgTableParams, поэтому мне не нужно делать это каждый раз, когда мне нужен стол.

Я смог это сделать, и это сработало, но только если у меня в контроллере используется только одна таблица, если я попытаюсь использовать его во второй таблице, это похоже на то, как служба запуталась в параметрах первой и второй таблиц. и перестань работать.

Я попытался изменить службу на заводскую и попытался создать angular.copy службы, чтобы каждая копия создавала одну отдельную таблицу, но при этом работала.

Каждый раз, когда мне нужен стол, он выглядит так:

$scope.tableParams = NgTableDataService.getGenericTableParams($scope.onboardcomputerstatus, $scope.filterObject);

$scope.searchTable = { filter: '' };
$scope.tableParams = new NgTableParams({
    count: $scope.session.user.tablePagination,
    filter: $scope.searchTable.filter
}, {
    counts: rowsPerPageTemplate,
    getData: function (params) {
        var funcFilter = function (item) {

            var pfilter = params.filter().filter.toUpperCase();
            return item.onboardComputer.id.toString().indexOf(pfilter) >= 0
                || (!!item.onboardComputer.remainingMonitoringMsgs ? item.onboardComputer.remainingMonitoringMsgs : "").toString().indexOf(pfilter) >= 0
                || $filter('date')((!!item.onboardComputer.oldestMonitoringTimestamp ? item.onboardComputer.oldestMonitoringTimestamp : ""), Session.get().company.dateHourFormatHTML).indexOf(pfilter) >= 0
                || $filter('date')((!!item.lastCommunicatio ? item.lastCommunicatio : ""), Session.get().company.dateHourFormatHTML).indexOf(pfilter) >= 0
                || $filter('date')((!!item.lastRegister ? item.lastRegister : ""), Session.get().company.dateHourFormatHTML).indexOf(pfilter) >= 0
                || item.vehicle.code.toUpperCase().indexOf(pfilter) >= 0
                || item.vehicle.name.toUpperCase().indexOf(pfilter) >= 0;
        }
        filteredData = params.filter() ? $filter('filter')($scope.onboardcomputerstatus, funcFilter) : $scope.onboardcomputerstatus;
        if (!!filteredData && filteredData.length >= 0) {
            params.total(filteredData.length);
            var rowsPerPageTemplateWithAllData = rowsPerPageTemplate.slice();
            var isFound = rowsPerPageTemplateWithAllData.some(function (element) {
                return element === filteredData.length;
            });
            var filteredDataLength = filteredData.length + (isFound ? 1 : 0);
            rowsPerPageTemplateWithAllData.push(filteredDataLength);
            params.settings().counts = rowsPerPageTemplateWithAllData;
            if (params.count() === MY_CONSTANTS.TABLE_PAGINATION_ALL) {
                params.count(filteredDataLength);
            }
            if (params.total() <= params.count()) {
                params.page(1);
            }
            var x = $filter('orderBy')(filteredData, params.orderBy());
            var y = x.slice((params.page() - 1) * params.count(), params.page() * params.count());
            return y;
        } else {
            return null;
        }
    }
});

Итак, я попытался сделать фабрику так:

angular.module('control-room').factory('NgTableDataFactory', function (
    $filter,  MY_CONSTANTS, NgTableParams, Session
) {

    var ngTableObj = {};

    ngTableObj.tableData = {};
    ngTableObj.filterObject = {};
    ngTableObj.session = Session.get();
    ngTableObj.defaultDateFormat = (!!ngTableObj.session.company ? ngTableObj.session.company.dateHourFormatHTML : null);
    ngTableObj.tablePagination = (!!ngTableObj.session.user ? ngTableObj.session.user.tablePagination : MY_CONSTANTS.QTD_REG_TAB_INDEX);

    ngTableObj.NgTableParamsFactory = new NgTableParams({
        count: ngTableObj.tablePagination,
        filter: ""
    }, {
        counts: rowsPerPageTemplate,
        getData: function (params) {
            if (!!params.filter().filter && params.filter().filter != '') {
                var pfilter = params.filter().filter.toUpperCase();
            } else {
                var pfilter = '';
            }
            let filteredData = params.filter() ? $filter('filter')(ngTableObj.tableData, ngTableObj.funcFilterFactory(ngTableObj.filterObject, pfilter)) : ngTableObj.tableData;
            if (!!filteredData && filteredData.length >= 0) {
                params.total(filteredData.length);
                var rowsPerPageTemplateWithAllData = rowsPerPageTemplate.slice();
                var isFound = rowsPerPageTemplateWithAllData.some(function (element) {
                    return element === filteredData.length;
                });
                var filteredDataLength = filteredData.length + (isFound ? 1 : 0);
                rowsPerPageTemplateWithAllData.push(filteredDataLength);
                params.settings().counts = rowsPerPageTemplateWithAllData;
                if (params.count() === MY_CONSTANTS.TABLE_PAGINATION_ALL && filteredDataLength > 0) {
                    params.count(filteredDataLength);
                }
                var x = $filter('orderBy')(filteredData, params.orderBy());
                var y = x.slice((params.page() - 1) * params.count(), params.page() * params.count());
                return y;
            } else {
                return null;
            }
        }
    });

    ngTableObj.findPropertyValue = function (obj, propertyList){
        let aux = obj;
        for(property of propertyList){
            aux = aux[property];
        }
        return aux
    };

    ngTableObj.funcFilterFactory = function (f_Object, p_filter) {
        return function (item) {
            var result = false;
            if (!!f_Object.columnNames) {
                f_Object.columnNames.forEach(function (row) {
                    if (!result){
                        const propertyValue = ngTableObj.findPropertyValue(item, row.split('.'));
                        result = (propertyValue ? propertyValue.toString() : "").toUpperCase().indexOf(p_filter) >= 0 || result;
                    }
                });
            };
            if (!!f_Object.translateNames) {
                f_Object.translateNames.forEach(function (row) {
                    if (!result){
                        const propertyValue = ngTableObj.findPropertyValue(item, row.split('.'));
                        result = $filter('translate')((propertyValue != null ? propertyValue.toString() : "").toUpperCase()).indexOf(p_filter) >= 0 || result;
                    }
                });
            }
            if (!!f_Object.dateFormat) {
                f_Object.dateFormat.forEach(function (row) {
                    if (typeof(row) == 'string') {
                        if (!result) {
                            const propertyValue = ngTableObj.findPropertyValue(item, row.split('.'));
                            result = propertyValue ? $filter('date')(propertyValue, ngTableObj.defaultDateFormat).toUpperCase().indexOf(p_filter) >= 0 : false || result;
                        }
                    }else {
                        if (!result) {
                            const propertyValue = ngTableObj.findPropertyValue(item, row[0].split('.'));
                            result = propertyValue ? $filter('date')(propertyValue, row[1]).toUpperCase().indexOf(p_filter) >= 0 : false || result;
                        }
                    }
                });
            }
            return result;
        };
    };
    return ngTableObj
});

и в контроллере так:

$scope.filterObject = {
    columnNames : ['onboardComputer.id', 'onboardComputer.remainingMonitoringMsgs', 'vehicle.code', 'vehicle.name' ],
    dateFormat : ['onboardComputer.oldestMonitoringTimestamp', 'lastCommunicatio', 'lastRegister' ]
};

$scope.tableFactory = NgTableDataFactory;
$scope.tableFactory.tableData = $scope.onboardcomputerstatus;
$scope.tableFactory.filterObject = $scope.filterObject;
$scope.tableFactory.session = Session.get();

$scope.tableParams = $scope.tableFactory.NgTableParamsFactory

Как я уже сказал, таким образом он работает хорошо, но только если я использую один раз, если у меня есть 2 таблицы, он перестает работать

...