javascript - 在作用域与父作用域中观察相同值的变化——有区别吗?

标签 javascript angularjs watch

我有一个关于 Angular watch 的非常基本的问题。假设我在指令的链接函数中有以下内容:

scope.$watch(function(){
    return element.isVisible();
  }, myFuncUponVisibleChange);

这是否与:

scope.$parent.$watch(function(){
     return element.isVisible();
  }, myFuncUponVisibleChange);

换句话说,在上述两种情况下,Angular 是否在监视同一元素的可见性?

最佳答案

是的,两个作用域观察者都观察同一个元素,因为 element 指的是特定的对象,它在观察者函数中被引用。

是的,有很大的不同。

AngularJS 中的许多性能问题都是由于摘要循环影响整个范围层次结构这一事实引起的。也就是说,$scope.$apply() 从上到下触发所有观察者。

一旦应用程序足够复杂(它始终取决于客户端和应用程序,但为简单起见,关键点通常估计为约 1000 个观察者),它开始变得对摘要无响应。

优化它的一个好方法是封装指令更改并防止指令在根范围内宣布摘要,除非全局摘要是所需的行为。在这种情况下,可以调用 $scope.$digest() 而不是 $scope.$apply() (这两者之间的根本区别在于后者 calls $rootScope.$digest() ).

区别就在这里。 scope.$parent.$watch(...) watcher 不会在 $scope.$digest() 上触发,但会在 $scope 上触发.$申请()。它说明了为什么指令隔离很重要,以及为什么从子级引用父级作用域是个坏习惯。

另一个令人不快的惊喜是 scope.$parent.$watch(...) 可能会导致内存泄漏。如果拥有 scope 的元素被销毁,watcher 将不会被自动清除。它将引用分离的 element,防止对象被垃圾回收。

$scope.$parent 是邪恶的。

关于javascript - 在作用域与父作用域中观察相同值的变化——有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38254860/

相关文章:

javascript - 如何使用 javascript、css、html 在网站表单的文本输入字段中放置一个按钮

javascript - 如何在javascript中将JSON数据转换为XML格式数据并下载文件

angularjs - 如何制作不需要的 Angular UI Datepicker

laravel - vuejs 2 中的 Watch 方法不更新 isAuth 的值

import - Sass 不观察@import 文件中的变化

javascript - Angular : directive watch attribute expression

javascript - moment.js 获取 hh :mm:ss from a decimal nr

javascript - cucumber 和 Protractor 有什么区别?

node.js - Mongoose 使用多个参数搜索 FindOne

javascript - 为什么removeClass()和addClass()不起作用?