在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。
这真的属于服务吗?
答案 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>