How to prevent an angular-bootstrap dropdown from closing (Unbind Event which was bound by a directive)

后端 未结 9 1519
你的背包
你的背包 2020-12-28 12:52

I am using the Angular-Bootstrap Dropdown. I want to prevent it from closing on click until the user closes it intentionally.

Default state is: The Dropdown closes

相关标签:
9条回答
  • 2020-12-28 12:56

    This is a crude way of overriding it. You need to control the is-open attribute manually and hijack the on-toggle event, example:

    <div class="btn-group" dropdown is-open="ctrl.isOpen" on-toggle="toggled(open)">
        <button type="button" class="btn btn-primary dropdown-toggle">
            Button dropdown <span class="caret"></span>
        </button>
        <ul class="dropdown-menu" role="menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
            <li><a href="#">Separated link</a></li>
        </ul>
    </div>
    

    Controller:

        $scope.toggled = function (open) {
            $timeout(function () {
                $scope.ctrl.isOpen = true;
            });
        };
    

    I would ask for a property on the dropdownConfig constant (something like autoClose) for a permanent solution.

    0 讨论(0)
  • 2020-12-28 12:56

    You can also use this solution : https://gist.github.com/Xspirits/684beb66e2499c3ff0e5 Gives you a bit more of control over the dropdown, if that's ever needed.

    0 讨论(0)
  • 2020-12-28 13:01

    This is an even more crude way of overriding it based on Rob Jacobs answer except that it prevents the ugly flickering ulilcht commented on:

        $scope.toggled = function (open) {
            $scope.open = true;
            var child = $scope.$$childHead;
            while (child) {
                if (child.focusToggleElement) {
                    child.isOpen = true;
                    break;
                }
                child = child.$$nextSibling;
            }
        };
    
    0 讨论(0)
  • 2020-12-28 13:02

    I solved this by adding the following to my drop down-menu. This prevents the drop down from closing unless you click on the tag that opens it

    <ul class="dropdown-menu" ng-click="$event.stopPropagation()">
    
    0 讨论(0)
  • 2020-12-28 13:05

    For those who are using Angular UI-Bootstrap 0.13.0 or later version, here is the cleaner way that states on the UI-Bootstrap documentation.

    By default the dropdown will automatically close if any of its elements is clicked, you can change this behavior by setting the auto-close option as follows:

    • always - (Default) automatically closes the dropdown when any of its elements is clicked.

    • outsideClick - closes the dropdown automatically only when the user clicks any element outside the dropdown.

    • disabled - disables the auto close. You can then control the open/close status of the dropdown manually, by using is-open. Please notice that the dropdown will still close if the toggle is clicked, the esc key is pressed or another dropdown is open. The dropdown will no longer close on $locationChangeSuccess events.

    Here is the link to the documentation: https://angular-ui.github.io/bootstrap/#/dropdown

    0 讨论(0)
  • 2020-12-28 13:08

    You can decorate directives.

    With this way you don't have to touch the original code and you can keep the original behaviour.

    You can put a close button inside the dropdown

    HTML

    <div class="dropdown-menu keep-dropdown-open-on-click" role="menu">
        <i class="icon-close close-dropdown-on-click"></i>
    </div>
    

    JS

    angular.module('app').config(uiDropdownMenuDecorate);
    uiDropdownMenuDecorate.$inject = ['$provide'];
    function uiDropdownMenuDecorate($provide) {
    
        $provide.decorator('dropdownMenuDirective', uiDropdownMenuDecorator);
    
        uiDropdownMenuDecorator.$inject = ['$delegate'];
    
        function uiDropdownMenuDecorator($delegate) {
    
            var directive = $delegate[0];
            var link = directive.link;
    
            directive.compile = function () {
                return function (scope, elem, attrs, ctrl) {
                    link.apply(this, [scope, elem, attrs, ctrl]);
                    elem.click(function (e) {
                        if (elem.hasClass('keep-dropdown-open-on-click') && !angular.element(e.target).hasClass('close-dropdown-on-click')) {
                            e.stopPropagation();
                        }
                    });
                };
            };
    
            return $delegate;
        }
    }
    
    0 讨论(0)
提交回复
热议问题