¿Cómo compartir lógica común entre controladores?

Tengo dos páginas y dos controladores que realizan búsquedas en el mismo conjunto de datos. Uno tiene una forma simple para especificar los criterios de búsqueda. El otro permite al usuario seleccionar datos en un mapa (seleccionando un área o haciendo clic en las características del mapa).

El resultado de la búsqueda se muestra en una tabla de datos debajo de los controles de búsqueda (en la misma página).

Por lo tanto, los controladores tienen diferentes funciones de búsqueda, pero también comparten una gran cantidad de comportamiento común, es decir, mostrar la cuadrícula, paginación, recarga, edición por lotes de datos de la cuadrícula, etc.

Como resultado, hay varias funciones que se repiten, a veces con ligeras variaciones, a veces exactamente idénticas, en ambos controladores.

La parte de la página que muestra los datos también es una plantilla compartida, incluida conng-include en ambas páginas de búsqueda.

Aquí hay un ejemplo :

$scope.selectAllRows = function(){

    var selectedItems = $scope.searchState.selectedItems;

    angular.forEach($scope.searchState.searchResult.rows, function(row){
        // add only if not already selected
        if(selectedItems.indexOf(row) < 0){
            selectedItems.push(row);
        }
    });

};

Esta función selecciona todas las filas de la tabla. Está obligado a lang-click de un botón en la página.

Hay muchas otras funciones como esta, que básicamente leen algún estado del$scope, realice alguna lógica y coloque algo nuevo de nuevo en el$scope.

Me gustaría eliminar la duplicación de estas funciones y reagrupar el comportamiento común en una sola unidad de código.

Nota: lo que estoy tratando de compartir aquí es el comportamiento, no los datos. Estas funciones realizarán la misma lógica, pero en diferentes ámbitos.

Como se trata realmente de material de presentación / interfaz de usuario, y debe colocarse en el$scope, No creo que se pueda usar un servicio porque$scope es estrictamente controlador y no se puede inyectar en los servicios.

Estoy experimentando con la definición de una función independiente, en un archivo diferente, y llamando a esta función desde ambos controladores:

myapp.defineCommonControllerBehaviour = function($scope, someOtherService){
    $scope.selectAlRows = function(){....}

    $scope.someOtherCommonTask = function(){
         someOtherService.doTheTask();
    }

    //etc...
};

//controller 1
myapp.defineCommonBehaviour($scope, someOtherService);

//controller 2
myapp.defineCommonBehaviour($scope, someOtherService);

Funciona pero no es muy elegante, ya que define una función en el ámbito global, fuera de cualquier módulo angular.

¿Hay una forma nativa angular de lograr esto? ¿O al menos más en línea con la arquitectura angular?

Respuestas a la pregunta(2)

Su respuesta a la pregunta