Где вы помещаете этот вид кода контроллера в угловое приложение?
Следующий код необходим в 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>