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



我有一个奇怪的情况。我有一个控制器,我想在对话框打开时控制它。我正在将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。

最新更新