你把这种控制器代码放在一个有角度的应用程序中的哪个位置?

时间:2014-03-19 13:11:50

标签: angularjs ng-grid

在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
                    }
                }
            }
        });
    }

我遇到的问题是我在哪里放置这个通用代码?它显然是UI代码,所以它似乎不属于服务,但没有经典的继承方案(我能够发现),这将允许我把它放在“基类”

理想情况下,这将是ng-grid的一部分,并且不会涉及如此讨厌的黑客攻击,但是ng-grid 2.0对于功能是关闭的,而ng-grid 3.0是谁知道未来有多远。

如果我从当前的控制器中提取它,我想我必须注入这个代码的$ scope。

这真的属于服务吗?

1 个答案:

答案 0 :(得分:1)

我可能只是把它放在一个服务中并将$ scope传递给它,但你确实有其他选择。您可能需要查看此演示文稿,因为它涵盖了组织代码的不同方式:https://docs.google.com/presentation/d/1OgABsN24ZWN6Ugng-O8SjF7t0e3liQ9UN7hKdrCr0K8/present?pli=1&ueb=true#slide=id.p

<强>混入

您可以将它放在自己的对象中,并使用angular.extend();

将其混合到任何控制器中
var ngGridUtils = {
    selectOnGridReady: function(gridOptions, indexToSelect, eventCount) {
        ...
    }
};

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

<强>继承

如果您使用控制器的'controller as'语法,那么您可以将它们视为类,只使用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>