Где вы помещаете этот вид кода контроллера в угловое приложение?

Следующий код необходим в 2 разных контроллерах (на данный момент, может быть, больше контроллеров позже). Код работает вокруг проблемы, которую я обнаружил в ng-grid, и позволяет отложить выбор строки (после загрузки данных).

    // Watch for the ngGridEventData signal and select indexToSelect from the grid in question.
    // eventCount parameter is a hack to hide a bug where we get ngGridEventData spam that will cause the grid to deselect the row we just selected 
    function selectOnGridReady(gridOptions, indexToSelect, eventCount) {
        // Capture the grid id for the grid we want, and only react to that grid being updated.
        var ngGridId = gridOptions.ngGrid.gridId;
        var unWatchEvent = $scope.$on('ngGridEventData', function(evt, gridId) {
            if(ngGridId === gridId) {
                //gridEvents.push({evt: evt, gridId:gridId});
                var grid = gridOptions.ngGrid;

                gridOptions.selectItem(indexToSelect, true);
                grid.$viewport.scrollTop(grid.rowMap[0] * grid.config.rowHeight);

                if($scope[gridOptions.data] && $scope[gridOptions.data].length) {
                    eventCount -= 1;
                    if(eventCount <= 0) {
                        unWatchEvent(); // Our selection has been made, we no longer need to watch this grid
                    }
                }
            }
        });
    }

У меня проблема в том, где я могу разместить этот общий код? Это, очевидно, код пользовательского интерфейса, так что, похоже, он не принадлежит сервису, но нет классической схемы наследования (которую я смог обнаружить), которая позволила бы мне поместить его в "базовый класс".

В идеале это было бы частью ng-grid и не требовало бы такого неприятного взлома, но ng-grid 2.0 закрыт для функций, а ng-grid 3.0 знает, как далеко в будущее.

Еще одна проблема - это $scope, которую, я полагаю, мне пришлось бы внедрить в этот код, если я вытяну его из текущего контроллера.

Это действительно относится к услуге?

1 ответ

Решение

Я, вероятно, просто поместил бы это в службу и передал бы $scope, но у вас есть другие варианты. Возможно, вы захотите взглянуть на эту презентацию, так как она охватывает различные способы организации вашего кода: https://docs.google.com/presentation/d/1OgABsN24ZWN6Ugng-O8SjF7t0e3liQ9UN7hKdrCr0K8/present?pli=1&ueb=true

Примеси

Вы можете поместить его в свой собственный объект и смешать его с любыми контроллерами, используя angular.extend();

var ngGridUtils = {
    selectOnGridReady: function(gridOptions, indexToSelect, eventCount) {
        ...
    }
};

var myCtrl = function() {...};
angular.extend(myCtrl, ngGridUtils);

наследование

Если вы используете синтаксис "контроллер как" для своих контроллеров, то вы можете обращаться с ними как с классами и просто использовать наследование JavaScript.

var BaseCtrl = function() {
    ...
}

BaseCtrl.prototype.selectOnGridReady = function(gridOptions, indexToSelect, eventCount) {
    ...
};

var MyCtrl = function() {
    BaseCtrl.call(this);
};

MyCtrl.prototype = Object.create(BaseCtrl.prototype);

HTML:

<div ng-controller="MyCtrl as ctrl"></div>
Другие вопросы по тегам