【问题标题】:How to communicate between directive (tree component) and any other controller or directive in AngularJS app?如何在指令(树组件)和 AngularJS 应用程序中的任何其他控制器或指令之间进行通信?
【发布时间】:2014-10-10 13:43:37
【问题描述】:

首先,我已经阅读了很多关于控制器之间通信的信息,以至于我现在对最好的方法感到困惑。我知道我应该使用服务,但从你们写的例子中真的不知道这意味着什么。

这是我的场景: 我的页面左侧有一个带有简单文件夹/文件树的侧栏。我使用了 angular Tree Component,它对我很有用:http://jimliu.github.io/angular-ui-tree/

在页面的右侧,我有一个正在被用户导航更改的视图。 每次用户选择树上的任何节点时,我都希望能够告诉任何右侧页面控制器已选择了哪个节点。树上的每个选择都应通知任何想要收听该更改的人。

我不喜欢使用 $rootScope 并从服务中触发事件的想法,这是唯一的方法吗?

【问题讨论】:

  • 这似乎是最好的方法。它完全符合您的要求。如果您使用事件进行通信,我认为服务没有任何用处。该指令可以直接访问 $rootScope 服务,并且控制器有一个 $scope。
  • 您寻求的交流的性质是什么?如果只是为了共享数据,我会说您最好的选择是使用服务,我也不喜欢使用 $rootScope。
  • 如果您的右侧指令 $scope 是控制器 $scope 的子级,那么您应该从当前 $scope 中 $emit,您也可以将这个 pubsub 库用于 angularjs,它可以稍微优化通信,但是最好的方式是服务。
  • 如果你有两个相同指令的实例怎么办?服务有一个实例,你怎么知道你申请的是哪一个?

标签: angularjs angularjs-directive angularjs-scope angular-ui angular-ui-bootstrap


【解决方案1】:

为了说明如何做到这一点,我创建了一些示例代码,使用服务在控制器和指令之间共享数据:

app.factory('SharedService', function() {
  return {
    sharedObject: {
      value: ''
    }
  };
});

http://plnkr.co/edit/Q1VdKJP2tpvqqJL1LF6m?p=preview

希望有帮助

【讨论】:

  • 10 倍!这真的有助于理解。
  • 如果你有相同的指令但有两次,比如树指令,但你有两棵树。该服务是单例的,因此您如何在服务中判断他应该更新哪个指令。在这种情况下可以做什么?
  • 在这种情况下,你的指令有一个dependency,所以解决它的一种方法是通过一个属性传递它应该监视的值,请看一下 plunkr,我刚刚更新了它一个例子:plnkr.co/edit/Q1VdKJP2tpvqqJL1LF6m?p=preview
  • 这有帮助吗?
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 2013-05-03
  • 2017-06-19
  • 2016-03-31
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多