angular (). service () не получит обновление объекта, который я передаю в качестве параметра - PullRequest
0 голосов
/ 09 января 2019

Ну что ж, первый раз здесь, извините за беспорядок или длинный текст.

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

Подробное объяснение:

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

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

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

Код моей страницы.

$scope.funcFilter = function(pfilter){
    return function (item) {
        return item.name.toUpperCase().indexOf(pfilter) >= 0
            || 
item.criticality1.toString().toUpperCase().indexOf(pfilter) >= 0
            || 
item.criticality2.toString().toUpperCase().indexOf(pfilter) >= 0
            || $filter('translate') 
(item.active.toString().toUpperCase()).indexOf(pfilter) >= 0;
    }
}
    $scope.searchTable = {filter: ""};
    $scope.tableParams = 
NgTableDataService.getGenericTableParams($scope.alertsensorconfigs, 
$scope.funcFilter, $scope.searchTable.filter)

Функция удаления на моей странице:

AlertSensorConfig.remove({id: obj.id}, function () {
                $scope.alertsensorconfigs.splice($scope.alertsensorconfigs.indexOf(obj), 1);
                $scope.tableParams.reload().then(function(data) {
                    if (data.length === 0 && $scope.tableParams.total() > 0) {
                        $scope.tableParams.page($scope.tableParams.page() - 1);
                        $scope.tableParams.reload();
                    }
                });
            },

Мой сервис:

angular.module('control-room').service('NgTableDataService', 
function ($filter, NgTableParams, Session) {

    var session = Session.get();

    this.getGenericTableParams = function(tableData, funcFilter, searchTableFilter){
        return new NgTableParams({
            count: session.user.tablePagination,
            filter: searchTableFilter
        }, {
            counts: rowsPerPageTemplate,
            getData: function (params) {
                if (params.filter() == ''){
                    var pfilter = '';
                }else{
                    var pfilter = params.filter().filter.toUpperCase();
                }
                let filteredData = params.filter() ? $filter('filter')(tableData, funcFilter(pfilter)) : tableData;
                if (!!filteredData && filteredData.length >= 0) {
                    params.total(filteredData.length);
                    var rowsPerPageTemplateWithAllData = rowsPerPageTemplate.slice();
                    var isFound = rowsPerPageTemplateWithAllData.some(function (element) {
                        return element === filteredData.length;
                    });
                    params.settings().counts = rowsPerPageTemplateWithAllData.filter(item=>item<filteredData.length)

                    if (filteredData.length >= 5){
                     params.settings().counts.push(filteredData.length);
                    }
                    rowsPerPageTemplateWithAllData.push(filteredData.length + (isFound ? 1 : 0));  
                    if (session.user.tablePagination >= params.settings().counts[params.settings().counts.length-1]){
                        params.settings().count = params.settings().counts[params.settings().counts.length-1];
                    }else{
                        params.settings().count = session.user.tablePagination;
                    }
                    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 {
                    params.settings().counts = [];
                    return null;
                } 
            }
        });
    };

И функция таблицы ng, которая перезагружает таблицу после удаления:

this.reload = function() {
            var self = this,
                pData = null;

            settings.$loading = true;

            prevParamsMemento = angular.copy(createComparableParams());
            isCommittedDataset = true;

            if (self.hasGroup()) {
                pData = runInterceptorPipeline($q.when(settings.getGroups(self)));
            } else {
                pData = runInterceptorPipeline($q.when(settings.getData(self)));
            }

            log('ngTable: reload data');

            var oldData = self.data;
            return pData.then(function(data) {
                settings.$loading = false;
                errParamsMemento = null;

                self.data = data;
                event even when data === oldData
                ngTableEventsChannel.publishAfterReloadData(self, data, oldData);
                self.reloadPages();

                return data;
            }).catch(function(reason){
                errParamsMemento = prevParamsMemento;
                // "rethrow"
                return $q.reject(reason);
            });
        };

есть какой-то способ убедиться, что объект, который я передаю в качестве параметра для моего сервиса, обновляется каждый раз, когда я его вызываю, например какая-то привязка?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Думаю, мне удастся решить.

NgTable имеет свою собственную функцию reload (), но она не работает, потому что она получает текущее значение FilterData и заменяет одно значение tableData , но tableData на моем сервисе был установлен только тогда, когда он назывался первый раз и не обновлялся, когда я обновил $ scope.alertsensorconfigs .

Итак, что мне удалось сделать после сильной головной боли, так это создать в моем сервисе: Переменная serviceTableData , которая получает $ scope.alertsensorconfigs при вызове службы, поэтому она является глобальной для моей службы. И мою собственную функцию reload (), которую я заменял в каждом месте, где мой контроллер использовал NGTable reload ().

Моя служба reload (), вызванная, получает в качестве параметра от контроллера $ scope.alertsensorconfigs после того, как контроллер удалит или отредактирует элемент, затем он установит для serviceTableData значение обновленные данные получены как param, а затем вызывает reg () NgTable.

Итак, все закончилось так:

angular.module().service('NgTableDataService', 
function ($filter, NgTableParams, Session, MY_CONSTANTS) {

    var session = Session.get();
    var serviceTableParam = null;
    var serviceTableData = null;

    this.reloadTableData = function (tableDataAtt){
        serviceTableData = tableDataAtt;
        serviceTableParam.reload().then(function(data) {
            if (data.length === 0 && serviceTableData.total() > 0) {
                serviceTableParam.page(serviceTableParam.page() - 1);
                serviceTableParam.reload();
            }
        return this.tableData = tableDataAtt;
        });   
    };

    this.getGenericTableParams = function(tableData, searchTableFilter, funcFilter){

        serviceTableData = tableData;
        return serviceTableParam = new NgTableParams({
        // etc...
0 голосов
/ 09 января 2019

Редактировать: я неправильно понял вопрос

Согласно вашему комментарию, вы хотите обновить переменную в вашем сервисе и получить ее позже.

Что вы можете сделать, это:

  • К вашим услугам

    angular
        .module('app.core')
        .factory('', dataservice);
    
    dataservice.$inject = ['$http'];
    
    function dataservice($http) {
        return {
            myFunction: yourServiceFunction,
            myData: myData
        };
    
        var myData = [];
    
        function yourServiceFunction(tableData) {
            // DO SOMETHING
            myData = tableData;
            // DO SOMETHING
        }
    }
    

Таким образом, вы можете получить доступ к myData в вашей службе или в вашем контроллере, который обновлен в вашей функции значением tableData, которое вы передали, когда вызывали свою функцию.

И если вы хотите обновлять myData в вашем сервисе каждый раз, когда $scope.alertsensorconfigs меняется, добавьте $watch к этой переменной и создайте в вашем сервисе функцию, которая будет вызываться при каждом изменении значения $ scope и которая просто обновляется myData к вашим услугам.

Я надеюсь, что на этот раз я ответил на правильный вопрос:)

. , .

Здесь после: старый ответ, который не отвечает на вопрос

есть какой-то способ убедиться, что объект, который я передаю в качестве параметра для моего сервиса, обновляется каждый раз, когда я его вызываю, например какая-то привязка?

Да.

Прошу прощения, что не отвечаю с вашим кодом, но немного сложно разобраться в этом.

Самый простой способ - сделать что-то вроде этого:

$scope.alertsensorconfigs =
   yourService.yourMethod($scope.alertsensorconfigs, param2, param3).tableData;

В то время как метод ваших служб делает что-то вроде:

yourMethod = function (tableData, param2, param3) {
   // DO SOMETHING
   return { tableData : tableDataAfterModification, elem2 : 'elem2', elem3 : 'elem3' };
};
...