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