Angular - 没有 HTML 和广播事件的控制器

Angular - Controller with no HTML and broadcasted events

我有一个奇怪的情况。我有一个控制器,我想在对话框打开时对其进行控制。我将 ngDialog 与模板和指令结合使用。这是 DialogController 代码:

(function() {
    'use strict';

    angular.module('Common').controller('DialogController', DialogController);

    DialogController.$inject = ['$scope', 'ngDialog'];

    function DialogController($scope, ngDialog) {
        $scope.$on('openDialog', open);

        function open(which) {
            ngDialog.open({
                template: which,
                className: 'newproductdialog'
            });
        }
    }

})();

此控制器没有与之关联的 HTML - 它的唯一目的是打开、关闭等 ngDialog。

以下是我尝试在 HomeController 中触发对话框打开(vm.navigate 通过 ng-click 调用)的方法:

    function initNav() {
        /**
         * Nav items array.
         * @type {{name: string, id: string, selected: boolean, icon: string}[]}
         */
        vm.navs = [{
            name: 'Home',
            id: 'home',
            selected: true,
            icon: 'ss-home'
        }, {
            name: 'New',
            id: 'create-new-product',
            selected: false,
            icon: 'ss-addfile'
        }];
        /**
         * Color of the navigation elements.
         * @type {string}
         */
        vm.color = '#ea8daf';

        /**
         * Navigation function when clicking a nav item.
         * @param item {object} The $scope.navs object that was clicked.
         */
        vm.navigate = function(item) {
            switch(item.id) {
                case 'create-new-product':
                    ----->$rootScope.$broadcast('openDialog', 'newproduct');
                    break;
            }
        };
    }

以及上述方法的关联 HTML:<ft-nav items="homeCtrl.navs" onselect="homeCtrl.navigate" color="homeCtrl.color"></ft-nav>

但这实际上不起作用。我想知道是不是因为 DialogController 没有关联的 HTML?我在广播活动中做错了什么吗?我知道我可以使用服务并且 DialogController 可以观看服务,但使用 $broadcast 似乎是更好的方法。有任何想法吗??谢谢!

你是对的。如果未使用 ngController 指令在 DOM 元素上指定,DialogController 将不会 运行。

不要定义控制器,而是使用 .run 块。

app.run(function ($rootScope, ngDialog) {
  /* ... */
});

传递给 .run 的代码将立即 运行 而无需任何关联 DOM。