Angularjs 如何在控制器之间不使用SharedService的情况下进行通信?
我正在阅读关于控制器和指令之间通信的所有答案,但在我看来,这似乎是使用共享服务并将其注入其中每一个的。当我开发一个非常大规模的应用程序时,我不知道我的页面将包含什么内容。我可能有2个控制器需要在它们之间通信,我也可能有5个指令和2个控制器在同一页中。我从零开始就不知道我的视图/页面中会有什么内容,所以我需要一种更好的方式来沟通它们。我在寻找更好的方法,正确的方法 上面是我正在处理的视图示例:左侧有一个指令树,右侧有图表控制器和指令网格。我可能有更多,但这是一个很好的例子,我可能有。请记住,视图可以有X个组件,您从一开始就不知道其中将包含什么 现在,假设每次我选择左边树中的节点时,我希望能够告诉其他控制器发生了nodeSelectedChange事件。我不想为它们中的每一个注入一个保存这些信息的服务,所以我考虑了一些类似于拥有页面管理器控制器的东西,它是所有视图之父。我的页面中的所有控制器/指令都只能由PageManagerController进行相互通信,他是页面中唯一知道其内部内容的人 这里要记住的重要事项:树不知道页面有图表或网格,它们不需要相互了解才能进行交流。页面管理器什么都知道,现在我想让它变魔术——它应该有服务吗?是否每个组件都有服务,并且服务可以与PageManager服务对话 帮我想想。希望我能把所有的点连接起来,创造一个更好的沟通方式。 我认为sharedService方式对于小型应用程序来说是很好的,当你从一开始就知道你的应用程序中发生了什么,但大多数时候——你只是不知道谁和什么时候会使用你的指令,它应该能够与每个人交谈 我不喜欢活动的地方:Angularjs 如何在控制器之间不使用SharedService的情况下进行通信?,angularjs,angularjs-directive,angularjs-scope,angular-ui,Angularjs,Angularjs Directive,Angularjs Scope,Angular Ui,我正在阅读关于控制器和指令之间通信的所有答案,但在我看来,这似乎是使用共享服务并将其注入其中每一个的。当我开发一个非常大规模的应用程序时,我不知道我的页面将包含什么内容。我可能有2个控制器需要在它们之间通信,我也可能有5个指令和2个控制器在同一页中。我从零开始就不知道我的视图/页面中会有什么内容,所以我需要一种更好的方式来沟通它们。我在寻找更好的方法,正确的方法 上面是我正在处理的视图示例:左侧有一个指令树,右侧有图表控制器和指令网格。我可能有更多,但这是一个很好的例子,我可能有。请记住,视图
我需要一种从指令中公开事件名称的方法,可能需要一个连接到该控制器的服务。您可以使用$on、$emit和$BROATCH在不同的控制器/作用域之间进行通信 请关注我之前的一篇文章。我有一个安装程序。你可以试试这个例子。
要了解更多信息,请访问-$rootScope.Scope您可以使用$on、$emit和$broadcast在不同的控制器/作用域之间进行通信 请关注我之前的一篇文章。我有一个安装程序。你可以试试这个例子。
要了解更多信息,请访问-$rootScope.Scope您可以使用$on、$emit和$broadcast在不同的控制器/作用域之间进行通信 请关注我之前的一篇文章。我有一个安装程序。你可以试试这个例子。
要了解更多信息,请访问-$rootScope.Scope您可以使用$on、$emit和$broadcast在不同的控制器/作用域之间进行通信 请关注我之前的一篇文章。我有一个安装程序。你可以试试这个例子。
要了解更多信息,请访问-$rootScope.Scope这实际上取决于您希望从tree指令共享到页面其他部分的信息类型 您面前有几个选项: 使用范围事件 正如上面提到的,您可以触发事件并在各种控制器和/或服务中侦听事件。也就是说,它会变得非常丑陋,非常快。追踪事件并找出什么事件监听器在给定的点上是活跃的,这会让最好的工程师头痛 使用服务 另一种选择是使用服务,比如PageManagerService。那么,
- 每次单击树项目都会在PageManagerService上设置一些信息,说明需要显示的页面、对象和项目
- 需要更改的每个组件都可以
- 注册在PageManagerService更改时触发的侦听器
- 在服务上添加一个监视,并在PageManagerService更改时运行其代码
- 不同的控制器
- 不同的模板,可能包含不同的组件和小部件
- 左边的Tree指令
- 一个名为top的ui视图
- 一个名为bottom的ui视图
$stateProvider.state('dashboard', {
views: {
"top": { templateUrl: 'my/dashboard.html', controller: 'DashboardCtrl'}
"bottom": { templateUrl: 'my/dashboard-grid.html', controller: 'DashboardGridCtrl'}
}
})
类似地,您可以为
$stateProvider.state('dashboard', {
views: {
"top": { templateUrl: 'my/dashboard.html', controller: 'DashboardCtrl'}
"bottom": { templateUrl: 'my/dashboard-grid.html', controller: 'DashboardGridCtrl'}
}
})
directive('tree', function(){
return {
scope: {
somevalue : "="
}
}
});
<tree somevalue="objectFromController">
directive('tree', function(treeState){
return {
scope: {
somevalue : "="
},
link: function(scope){
// some logic updating the treeState
treeState.openNodes = ['x', 'y'];
}
}
});
controller('ctrl', function($scope, treeState){
// react to treeState changes
// you can use $scope.$watch for it
// or any other way you like
// see: https://github.com/mr-mig/angular-react-to
});
directive('tree', function(){
return {
scope: {
model : "="
},
link: function(scope){
// some logic updating the treeState, stored as scope.model
scope.model.openNodes = ['x', 'y'];
}
}
});
controller('ctrl', function($scope, treeFactory){
$scope.treeModel = treeFactory.create();
// react to treeState changes
// you can use $scope.$watch for it
// or any other way you like
// see: https://github.com/mr-mig/angular-react-to
});
<tree model="treeModel">