Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在控制器之间不使用SharedService的情况下进行通信?_Angularjs_Angularjs Directive_Angularjs Scope_Angular Ui - Fatal编程技术网

Angularjs 如何在控制器之间不使用SharedService的情况下进行通信?

Angularjs 如何在控制器之间不使用SharedService的情况下进行通信?,angularjs,angularjs-directive,angularjs-scope,angular-ui,Angularjs,Angularjs Directive,Angularjs Scope,Angular Ui,我正在阅读关于控制器和指令之间通信的所有答案,但在我看来,这似乎是使用共享服务并将其注入其中每一个的。当我开发一个非常大规模的应用程序时,我不知道我的页面将包含什么内容。我可能有2个控制器需要在它们之间通信,我也可能有5个指令和2个控制器在同一页中。我从零开始就不知道我的视图/页面中会有什么内容,所以我需要一种更好的方式来沟通它们。我在寻找更好的方法,正确的方法 上面是我正在处理的视图示例:左侧有一个指令树,右侧有图表控制器和指令网格。我可能有更多,但这是一个很好的例子,我可能有。请记住,视图

我正在阅读关于控制器和指令之间通信的所有答案,但在我看来,这似乎是使用共享服务并将其注入其中每一个的。当我开发一个非常大规模的应用程序时,我不知道我的页面将包含什么内容。我可能有2个控制器需要在它们之间通信,我也可能有5个指令和2个控制器在同一页中。我从零开始就不知道我的视图/页面中会有什么内容,所以我需要一种更好的方式来沟通它们。我在寻找更好的方法,正确的方法

上面是我正在处理的视图示例:左侧有一个指令树,右侧有图表控制器和指令网格。我可能有更多,但这是一个很好的例子,我可能有。请记住,视图可以有X个组件,您从一开始就不知道其中将包含什么

现在,假设每次我选择左边树中的节点时,我希望能够告诉其他控制器发生了nodeSelectedChange事件。我不想为它们中的每一个注入一个保存这些信息的服务,所以我考虑了一些类似于拥有页面管理器控制器的东西,它是所有视图之父。我的页面中的所有控制器/指令都只能由PageManagerController进行相互通信,他是页面中唯一知道其内部内容的人

这里要记住的重要事项:树不知道页面有图表或网格,它们不需要相互了解才能进行交流。页面管理器什么都知道,现在我想让它变魔术——它应该有服务吗?是否每个组件都有服务,并且服务可以与PageManager服务对话

帮我想想。希望我能把所有的点连接起来,创造一个更好的沟通方式。 我认为sharedService方式对于小型应用程序来说是很好的,当你从一开始就知道你的应用程序中发生了什么,但大多数时候——你只是不知道谁和什么时候会使用你的指令,它应该能够与每个人交谈

我不喜欢活动的地方:

  • 在控制器内部触发的事件,而它应该在服务内部
  • 侦听器控制器也应该知道他要侦听的事件的名称。如果我将事件名称更改为$emit或$broadcast,我需要遍历所有应用程序中的侦听器$on(“eventName”),并更改为该唯一名称
  • 指令就像一个黑匣子,我不想每次都检查它的内部,并找出他正在广播的事件的名称,以便与之交流

  • 我需要一种从指令中公开事件名称的方法,可能需要一个连接到该控制器的服务。

    您可以使用$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更改时运行其代码
    服务本身将是共享状态,它将取决于指令和组件如何使用和响应状态中的更改

    使用用户界面路由器 但是我越是考虑这一点,它就越像是之类的好用例。UI路由器允许您定义状态,并让页面的不同部分以不同的方式响应状态更改。每个部分都可以通过加载以自己的方式响应状态更改

    • 不同的控制器
    • 不同的模板,可能包含不同的组件和小部件
    所以你最终会得到一个有

    • 左边的Tree指令
    • 一个名为top的ui视图
    • 一个名为bottom的ui视图
    树指令中的每一项都可以是一个ui sref,这只是一种别出心裁的说法,它不是重定向到URL,而是重定向到一个状态

    然后,您可以在应用程序中的单个位置定义配置,如下所示:

    $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">