1

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

这是我尝试vm.navigate在 HomeController 中触发对话框打开(通过 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 似乎是一种更好的方式。有任何想法吗??谢谢!

4

1 回答 1

2

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

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

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

传递给的代码.run将在没有任何关联 DOM 的情况下立即运行。

于 2015-07-08T22:44:08.020 回答