AngularJS - Appel d'une fonction de contrôleur à partir d'un service

Je suis tellement vert au Angulaire, je ne suis même pas sûr que j'ai été à la structuration d'une recherche de cette correctement. L'ensemble de la directive et de la terminologie du service est toujours me confondre certains, mais ce n'est pas ma question.

J'ai lu cet excellent article de la série d'avant en arrière: http://www.ng-newsletter.com/posts/beginner2expert-how_to_start.html

C'est pourquoi je suis à ce point dans mon application. Et pourquoi je sais que ma question a trait à la relation entre les services et les contrôleurs. Plutôt que de la syntaxe.

Voici donc un aperçu de l'application:

J'ai un contrôleur. Ce va et obtient un tas de données de la batterie de l'utilisateur à l'aide d'un appel AJAX vers un fichier PHP, et l'affiche sur l'écran à l'aide de ses propres $scope.

var masterApp = angular.module('masterApp', ['myFilters','commonControls']);

masterApp.controller('MasterCtrl', ['$scope','$http', '$filter', 'commonFarmSelector', 
    function($scope, $http, $filter, commonFarmSelector){

        ...

        $scope.masterCtrl.loadFarmData = function(farmId) {
            var postdata = {
               "farmId":farmId
            };

            $http.post('/service/farmproduction', postdata).success(function (data) {
                //Do stuff with the $scope using data
            }
        }

        $scope.masterCtrl.loadFarms();
}

Vous verrez que je suis l'injection de quelque chose appelé "commonControls". C'est un module que j'ai créé pour contenir les contrôles qui seront réutilisés par plusieurs contrôleurs. Dans ce cas, une liste déroulante qui contient une liste de fermes de l'utilisateur a accès (également obtenu par un appel AJAX):

var commonControlsApp = angular.module('commonControls', []);

commonControlsApp.controller('farmSelectorCtrl', ['$scope', '$http',function($scope, $http) {

    $scope.farmSelectorCtrl ={}

    //Change entire farm view when a different farm is selected
    $scope.farmSelectorCtrl.switchUserFarm = function() {
        var farmId = $scope.farmSelectorCtrl.selectedUserFarm;
        $scope.masterCtrl.loadFarms(farmId); //!!! Direct link to masterCtrl
    };

    //Get a list of the user's farms
    $http.post('/service/userfarms').success(function (data) {
        $scope.farmSelectorCtrl.userFarms = data.getFarmsPerUserResult.farmIds;
    });

}]);

Cela fonctionne bien. Mais comme vous pouvez le voir, le farmSelector est directement liée à masterCtrl. Et le comportement de cette loadFarmData fonction est spécifique à ce contrôleur. En d'autres termes, il ne font que des choses qui s'appliquent à cette page.

La chose est, ce farmSelector sera utilisé sur d'autres pages. Et le comportement précis d'un événement de changement sera différent pour chaque page. Donc j'ai du mal à savoir d'où ce comportement doit s'asseoir. Et comment il serait appelé dépend du contrôleur à l'aide de la farmSelector.

L'article lié ci-dessus suggère que cette farmSelector devrait être en service, de sorte qu'il peut être réutilisé ailleurs. Mais je suis encore confus sur la façon dont vous pourriez donner à un service générique spécifique l'action à entreprendre lorsqu'un événement est déclenché.

source d'informationauteur Aaryn