加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AngularJS中控制器之间通信方法

发布时间:2020-12-17 10:39:31 所属栏目:安全 来源:网络整理
导读:在同个angular应用的控制器之间进行通信可以有很多种不同的方式,本文主要讲两种: 和 基于scope继承的方式 最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为子控制器,它将继承

在同个angular应用的控制器之间进行通信可以有很多种不同的方式,本文主要讲两种:

基于scope继承的方式

最简单的让控制器之间进行通信的方法是通过scope的继承。假设有两个控制器Parent、Child,Child 在 Parent 内,那Child 可以称为子控制器,它将继承父控制器Parent的scope。这样,Child就可以访问到Parent的scope中的所有函数和变量了。需要注意的是,由于scope的继承也是基于Js的原型继承,如果变量是基本类型的,那在Child中的修改(写),有可能会导致Parent中的数据变脏。

基本类型变量的继承

$scope.location = 'Mos Eisley North' $scope.move = $scope.location = $scope.sell = $scope.location =

Location:

看完上面的代码我们知道,location属性是直接被注册到 $scope 中的,Droid控制器所拥有的scope从Sandcrawler控制器的scope中继承了这个属性并且可以读取它。看以下两个假设场景:

    如果 Sandcrawler 中改变了location属性,在 Droid 中也会读取到这个改变;在 view 中的表现则是:点击了Move按钮的话,两个 p 标签都会显示Mos Eisley South

  • 反过来,如果 Droid 中对$scope.location进行改写,它只改写自己scope中location属性的值,它不会影响 Sandcrawler 中的这个属性的值;在 view 中的表现则是:当点击了Sell按钮之后,两个控制器scope之间的数据共享就不复存在了,之后无论点多少次Move按钮,都影响不了 Droid 中的 p 标签的显示了

经过上面的教训,有时候我们想要达到的效果可能达不到(如点了Sell按钮之后再点Move还想让它起作用),这样在ng的开发者中逐渐达成了一个一致的约定,千万不要把那些可以被子级scope改写的属性用基础类型直接添加在 $scope 对象上,而是应该尽可能地用对象类型去添加。

对象类型变量的继承

通过上面的结论我们知道,可以用对象类型的变量来作为属性添加到 $scope 中去,这样,只要是引用了这个对象的,无论是谁,在哪个控制器里面,对这个对象变量的改写都会影响都所有引用了这个对象的实例。看下面的代码:

$scope.sandcrawler.location = 'Mos Eisley North' $scope.summon = $scope.sandcrawler.location =

Sandcrawler Location:

跑一下上面的代码就知道,当我们使用“召唤术”的时候,可以改写 Sandcrawler 控制下的 p 标签的显示了。

基于event传播的方式

基于scope继承的方式只能处理父子级控制器之间的通信问题,不能处理兄弟/相邻控制器之间的通信问题。这时候,我们需要使用基于event传播的方式来进行通信,这里,ng为我们提供了三个方法:$on,$emit,$broadcast,需要明确的是:这种方法不仅可以处理兄弟scope间的通信问题,对于解决父子scope间的通信也是毫无压力。

子-->父:$emit

整个过程是这样的:

    子scope中的控制器通过$scope.$emit触发一个事件向上传播

  • 这个事件会经过每一层的父scope,至于处不处理是父scope自己的事情了

  • 如果处理,就在想要处理的那个祖先scope中放一个$scope.$on监听着就行了三四三

  • $scope.location = 'Mos Eisley North' $scope.$on('summon', $scope.location = $scope.location = 'Owen Farm' $scope.summon = $scope.$emit('summon'

    Sandcrawler Location:

    Droid Location:

    如果你不想让你的事件再往更上层传播,在$on中的处理函数调用e.stopPropagation()即可。

父-->子:$broadcast

从父到子,用另外一个方法就是了,同样用$on监听着,all done,看下面代码:

= 'Mos Eisley North'= 'recall' = 'Owen Farm''recall',newLocation) { $scope.location =
Sandcrawler Location:

同级之间

拥有同个父scope的子级scope之间,也就是兄弟/相邻scope之间的通信,其实是借助“奶爸”传递消息的:

    子级scope中有谁想传消息了,$emit一个给“奶爸”

  • 然后通过“奶爸”$broadcast给所有孩子这个相同的信息,当然发出信息的那个可以选择是否要忽略掉自己发出的信息

$scope.$on('requestDroidRecall', $scope.$broadcast('executeDroidRecall' $scope.location = 'Owen Farm' $scope.recallAllDroids = $scope.$emit('requestDroidRecall' $scope.$on('executeDroidRecall', $scope.location = 'Sandcrawler'

R2-D2

Droid Location:

C-3PO

Droid Location:

上面代码中要注意的是:子scope通过$emit发出的事件名不能与父scope用$broadcast的事件名一样,如果有传参数,那当然参数可以一样,因为参数就是我们要传的数据。事件名不能一样是为了防止进入死循环。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读