Call method in directive controller from other controller

后端 未结 4 1809
轮回少年
轮回少年 2020-12-02 03:28

I have a directive that has its own controller. See the below code:

var popdown = angular.module(\'xModules\',[]);

popdown.directive(\'popdown\', function (         


        
4条回答
  •  一整个雨季
    2020-12-02 04:21

    This is an interesting question, and I started thinking about how I would implement something like this.

    I came up with this (fiddle);

    Basically, instead of trying to call a directive from a controller, I created a module to house all the popdown logic:

    var PopdownModule = angular.module('Popdown', []);
    

    I put two things in the module, a factory for the API which can be injected anywhere, and the directive for defining the behavior of the actual popdown element:

    The factory just defines a couple of functions success and error and keeps track of a couple of variables:

    PopdownModule.factory('PopdownAPI', function() {
        return {
            status: null,
            message: null,
            success: function(msg) {
                this.status = 'success';
                this.message = msg;
            },
            error: function(msg) {
                this.status = 'error';
                this.message = msg;
            },
            clear: function() {
                this.status = null;
                this.message = null;
            }
        }
    });
    

    The directive gets the API injected into its controller, and watches the api for changes (I'm using bootstrap css for convenience):

    PopdownModule.directive('popdown', function() {
        return {
            restrict: 'E',
            scope: {},
            replace: true,
            controller: function($scope, PopdownAPI) {
                $scope.show = false;
                $scope.api = PopdownAPI;
    
                $scope.$watch('api.status', toggledisplay)
                $scope.$watch('api.message', toggledisplay)
    
                $scope.hide = function() {
                    $scope.show = false;
                    $scope.api.clear();
                };
    
                function toggledisplay() {
                    $scope.show = !!($scope.api.status && $scope.api.message);               
                }
            },
            template: '
    ' + ' ' + ' {{api.message}}' + '
    ' } })

    Then I define an app module that depends on Popdown:

    var app = angular.module('app', ['Popdown']);
    
    app.controller('main', function($scope, PopdownAPI) {
        $scope.success = function(msg) { PopdownAPI.success(msg); }
        $scope.error   = function(msg) { PopdownAPI.error(msg); }
    });
    

    And the HTML looks like:

    
        
            
            Succeed
            Fail
        
    
    

    I'm not sure if it's completely ideal, but it seemed like a reasonable way to set up communication with a global-ish popdown directive.

    Again, for reference, the fiddle.

提交回复
热议问题