Где я должен разместить свой код ag-grid?

У меня есть одно представление, содержащее ag-сетку и один контроллер для моего углового приложения. Я пытаюсь очистить контроллер, сделать его «тонким», и я уже убрал часть кода в директиву и настроил службы для извлечения данных.

Теперь у меня остался большой блог с кодом ag-grid, который в идеале я хотел бы увидеть где-нибудь в другом месте, но я не уверен, где это будет лучше всего.

Есть ли здесь лучшая практика?

<div class="container" ng-controller="MainController">

<div class="row">
    <div class="col-sm-4">
        <div>
            <div ag-grid="gridOptions" class="ag-fresh" style="height: 500px; width: 100%"></div>
        </div>
    </div>
    <div class="col-sm-8">
        <div my-directive body-unid="currentUNID"></div>
    </div>
</div>

agGrid.initialiseAgGridWithAngular1(angular);

angular.module('app') .controller('MainController', function ($scope, myService, MyConfig) {

    $scope.isExternalFilterPresent = function () {
        return $scope.searchtext != "";
    };

    $scope.doesExternalFilterPass = function (node) {

        // Returning true means all the documents are displayed
        if ($scope.searchtext == "") {
            return true;
        }

        if ($scope.joinedUnidsOfSearch) {
            return ($scope.joinedUnidsOfSearch.indexOf(node.data['@unid']) >= 0);
        } else {
            return true;
        }
    };

    var columnDefs = [
        {
            headerName: "Navigation", field: "Subject", cellStyle: function (params) {
            if (params.data["@indent"]) {
                switch (params.data["@indent"]) {
                    case 1:
                        return {'margin-left': '10px'};
                        break;
                    case 2:
                        return {'margin-left': '20px'};
                        break;
                    case 3:
                        return {'margin-left': '30px'};
                        break;
                    case 4:
                        return {'margin-left': '40px'};
                        break;
                    default:
                        return {'margin-left': '50px'};
                        break;
                }
            } else {
                return {'font-size': 'large'};
            }
        }
            //, headerName: "unid", field: "@unid"
        }
    ];

    $scope.gridOptions = {
        columnDefs: columnDefs,
        rowSelection: 'single',
        enableFilter: true,
        isExternalFilterPresent: $scope.isExternalFilterPresent,
        doesExternalFilterPass: $scope.doesExternalFilterPass,

        angularCompileRows: true,
        onRowClicked: function (event) {
            //console.log('a row was clicked', event.data["@unid"]);
            $scope.currentUNID = event.data["@unid"];
            $scope.$apply();
        },
        onColumnResized: function (event) {
            //console.log('a column was resized');
        },
        onGridReady: function (event) {
            //console.log('the grid is now ready');
        },

        // onRowSelected: rowSelected,
        // onSelectionChanged: onSelectionChanged,

        onGridSizeChanged: function () {
            //console.log('Grid Size changed');
            $scope.gridOptions.api.sizeColumnsToFit();
        }
    };

    $scope.databaseTitle = MyConfig.databaseTitle;

    $scope.SearchButtonClick = function () {
        $scope.searchComment = '';
        loadSearchResults($scope);
    };

    $scope.ClearSearchBox = function () {
        $scope.searchtext = '';
        $scope.searchComment = '';
        $scope.gridOptions.api.onFilterChanged();
    };


    $scope.NextButtonClick = function () {
        //console.log("next button clicked");
        var selectedNodes = $scope.gridOptions.api.getSelectedNodes();
        if (selectedNodes) {
            if (selectedNodes && selectedNodes.length === 1) {
                var selectedNode = selectedNodes[0];
                $scope.gridOptions.api.forEachNodeAfterFilter(function (node) {
                    if (node.childIndex === (selectedNode.childIndex + 1)) {
                        node.setSelected(true);
                        $scope.currentUNID = node.data["@unid"];
                        return;
                    }
                });
            }
        }
    };

    $scope.PrevButtonClick = function () {
        //console.log("next button clicked");
        var selectedNodes = $scope.gridOptions.api.getSelectedNodes();
        if (selectedNodes) {
            if (selectedNodes && selectedNodes.length === 1) {
                var selectedNode = selectedNodes[0];
                $scope.gridOptions.api.forEachNodeAfterFilter(function (node) {
                    if (node.childIndex === (selectedNode.childIndex - 1)) {
                        node.setSelected(true);
                        $scope.currentUNID = node.data["@unid"];
                        return;
                    }
                });
            }
        }
    };

    function loadSearchResults($scope) {
        //console.log('loadSearchResults started');
        if ($scope.searchtext) {
            myService.loadAllUNIDSThatMatchSearch($scope.searchtext).then(function (data) {
                //console.log('start after loading of search UNIDS');
                var receiveddata = angular.fromJson(data);
                if (receiveddata) {
                    if (receiveddata.length > 0) {
                        $scope.searchComment = '';
                        var arrayUNIDS = receiveddata.map(function (a) {
                            return a["@unid"];
                        });
                        $scope.joinedUnidsOfSearch = arrayUNIDS.join(); // this variable gets used in the function doesExternalFilterPass
                        $scope.gridOptions.api.onFilterChanged(); // refreshes filter of grid
                        // set the selected document to the first of the search query
                        $scope.gridOptions.api.forEachNodeAfterFilter(function (node) {
                            if (node.firstChild === true) {
                                // node.setSelected(true);
                                $scope.gridOptions.api.selectNode(node, true);
                                $scope.currentUNID = node["@unid"];
                            }
                        });
                    } else {
                        if ($scope.searchtext == '' || $scope.searchtext == undefined) {
                            $scope.searchComment = 'Das Suchfeld ist leer!';
                        } else {
                            $scope.searchComment = 'Keine Dokumenten für ' + $scope.searchtext + ' gefunden.';
                        }


                    }
                }
                //console.log('end after loading of search UNIDS');
            });
        }
        //console.log('loadSearchResults ended');
    }

    myService.loadAllNavigationDocuments()
        .then(function (response) {
            $scope.gridOptions.api.setRowData(response);
        });


});

person Andrew Magerman    schedule 01.11.2016    source источник
comment
Не могли бы вы поделиться кодом? Я всегда использую для этого угловые компоненты.   -  person Fabio Silva Lima    schedule 01.11.2016
comment
сделано. Я знаю, что сейчас это некрасиво!   -  person Andrew Magerman    schedule 01.11.2016
comment
Я попытался переместить код в другой контроллер, но потом у меня возникла проблема с доступом к $scope   -  person Andrew Magerman    schedule 01.11.2016


Ответы (1)


Теперь, увидев ваш код, я думаю, вы можете переместить все элементы сетки в сервис. В службе создайте методы и вызовите их в своем контроллере следующим образом:

//create the event "onGridSizeChanged" for the grid
gridService.onGridSizeChanged($scope.gridOptions, fuction(options){
   //callback for size changed
});

Просто пример, поэтому создайте все остальные методы, которые вам нужны. Ваш контроллер будет чистым, и вы сможете использовать эту службу в других контроллерах. Какой метод имеет одну ответственность, и его легко поддерживать.

person Fabio Silva Lima    schedule 01.11.2016
comment
Итак, я определяю gridOptions в своем контроллере? - person Andrew Magerman; 01.11.2016
comment
да, вы определили gridOptios в своем контроллере и обрабатываете другие методы и события внутри службы angular. - person Fabio Silva Lima; 01.11.2016
comment
Мне удалось поместить columnDefs в мою службу, однако я блокирую, например, с помощью функции doExternalFilterPass. Ей нужен параметр узла, и как только я перемещаю функцию в службу, я получаю жалобы на то, что $scope неизвестен. Я думаю, что мне не хватает чего-то очень простого здесь. - person Andrew Magerman; 01.11.2016
comment
Я думаю, что эти функции doesExternalFilterPass и isExternalFilterPresent не используются в сетке, верно? Если нет, создайте его в $scope, а не в gridOptions. Оставьте gridOptions только для свойств/методов сетки. - person Fabio Silva Lima; 01.11.2016
comment
Они являются членами gridOptions, используемыми для фильтрации. - person Andrew Magerman; 01.11.2016
comment
Я не совсем уверен, находится ли код, который вы здесь показываете (gridService.OnGridSizeChanged), в моем контроллере или в моей службе. - person Andrew Magerman; 01.11.2016
comment
Итак, определение gridOptions должно быть в контроллере $scope. Но вы можете или не определять свои методы внутри сервиса или нет. Мое предложение: вы определяете все методы внутри службы. Я отредактирую свой ответ выше для полного решения. - person Fabio Silva Lima; 01.11.2016