当前位置: 首页 > 面试题库 >

$ rootScope。$ on与$ scope。$ on之间的差异

申屠恺
2023-03-14
问题内容

有人可以帮我了解应使用$rootScope.$on和的方式$scope.$on

我知道它主要是用于听取不同的作用域($ rootScope和$ scope)。

我的查询适用于以下情况:

我应该使用: $ rootScope。$ emit$ rootScope。$ on

要么

我应该选择: $ rootScope。$ with $ scope。$ on 广播
我知道这不是一个好选择,因为它将广播给所有$scopeobj。

要么

我应该去: $ rootScope。$ broadcast$ rootScope。$ on

如您所见,我需要在$ rootScope级别上处理事件。

以上3种实现有什么区别?


问题答案:

这是一个很好的问题,有一个解释给您。

首先请注意:

  • $scope.on('event');会听$scope.$broadcast('event')$rootScope.$broadcast('event')

  • $rootScope.on('event');会听$rootScope.$broadcast('event')$rootScope.$emit('event')

接下来,您需要注意:

  • $scope.on(); 当控制器失去它在视图或组件中的表示形式时(被销毁),它将被自动销毁。
  • 您需要$rootScope.$on()手动销毁。

>>如何销毁示例$rootScope.on()

//bind event
var registerScope = $rootScope.$on('someEvent', function(event) {
    console.log("fired");
});

// auto clean up `$rootScope` listener when controller getting destroy
// listeners will be destroyed by calling the returned function like registerScope();
$scope.$on('$destroy', registerScope);

>>>从Angular v1.5开始,我们可以使用组件生命周期以一种不错的方式管理初始化和销毁​​:

var myApp = angular.module('myApp',[]);

myApp.controller('MyCtrl', function ($scope, $rootScope) {

  var registerScope = null;

  this.$onInit = function () {
    //register rootScope event
    registerScope = $rootScope.$on('someEvent', function(event) {
        console.log("fired");
    });
  }

  this.$onDestroy = function () {
    //unregister rootScope event by calling the return function
    registerScope();
  }
});

此plnkr将为您显示$scope.on()
的不同行为$rootScope.on()

通过在此插入控件中切换视图,控制器将重新绑定到您的视图。该$rootScope.on();事件被绑定每次切换视图时不破坏前视图的事件绑定。这样,$rootScope.on()听众将被堆叠/倍增。$scope.on()绑定不会发生这种情况,因为它将通过切换视图而被破坏(在DOM中丢失E2E绑定表示形式->控制器被破坏了)。

$emit&之间的区别$broadcast是:

  • $rootScope.$emit()事件仅触发$rootScope.$on()事件。
  • $rootScope.$broadcast()将触发$rootScope.$on()$scope.on()事件(几乎所有听到此事件的事件)。
  • $scope.$emit()将触发其所有$scope.$on所有父项(父级控制器中的作用域)和$rootScope.$on()
  • $scope.$broadcast将仅触发$scope及其子项(子控制器中的作用域)。


 类似资料:
  • 如何使用和方法将对象从一个控制器发送到另一个控制器? 它的工作方式并不像我想的那样。和如何工作?

  • 问题内容: 现在,之间的性能差异和已被淘汰,没有任何理由,更喜欢到? 他们是不同的,是的。 仅限于范围层次结构(向上)-如果它适合您的设计,这可能很好,但是在我看来,这是一个相当随意的限制。 在所有 选择 收听此活动的人中都有效,这在我看来是一个更为明智的限制。 我想念什么吗? 编辑: 为了对回答做出澄清,调度的方向不是我要解决的问题。向上调度事件,-向下调度事件。但是,为什么不总是使用它来覆盖所

  • 问题内容: 如何使用和方法将对象从一个控制器发送到另一个控制器? 它不按我认为的方式工作。如何做和工作? 问题答案: 首先,父子范围关系确实很重要。你有两种可能性发出某些事件: -将事件向下分发到所有子范围, -通过范围层次结构向上调度事件。 我对你的控制器(作用域)关系一无所知,但是有几种选择: 如果scope of 是作用域的父级,则你的代码应通过替换为来工作: 如果你的范围之间没有父子关系,

  • 在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?

  • 问题内容: 有什么方法比它还好用吗? 例如,我有一个示例代码,如下所示: 您可能会注意到,选择器只检索了一项,在我的情况下,页面加载时该名称已经存在;没有动态添加。重要的是要提到我使用的是最新版本的jQuery:1.7.2。 对于该示例,即使我不使用该功能提供的其他功能,也应使用该示例? 问题答案: 在内部,直接映射到当前版本的jQuery。(同样适用于。)因此,如果您改而使用,则对性能的影响很小

  • 问题内容: 在MySQL中,和之间有什么区别?据我所知,只是语法更方便,而当列名不同时,则允许更多的灵活性。但是,这种差异是如此之小,您可能会以为他们会废除。 除了眼球以外,还有什么呢?如果是,在给定情况下应使用哪个? 问题答案: 它主要是语法糖,但是有一些区别值得注意: ON 是两者中更通用的。一个人可以在一个列,一组列甚至一个条件上联接表。例如: *当两个表共享它们所连接的名称完全相同的列时,