如何查找更改正在监视的对象的调用站点

2023-12-24

AngularJS 允许监听对象的变化,并调用提供给 $watch 函数的回调函数。对于像 ngGrid 这样使用 AngularJS 的大型库,对象经常被“监视”。

一旦调用了监视回调,如何追溯到导致对象发生更改的调用站点?

如果不知道是什么导致了变化,并因此导致了监视处理程序被调用,那么调试像 ngGrid 这样的库是非常困难的。我在可以预见变量可能更改的任何地方设置断点,然后尝试为执行管道构建一个图表,以跟踪导致对象更改的事件链。


你根本不能那样做。$watch只会添加一个回调来检查对象是否发生变化,并在摘要期间运行。

我想这是与像这样的框架的主要区别之一Backbone你在哪里扩展Model object.

话虽这么说,你might祝你好运$scope.$digest();故意的(更新模型,并解雇观察者),但这是一个延伸......

Update

问题是您认为手表和型号变化之间存在相关性,但事实并非如此。添加监视只是在摘要循环运行时添加要检查的内容。

此循环不是由对某个内容的更改触发的$scope,而是调用$scope.$apply,或者直接调用$scope.$digest.

请注意,大多数(all?)Angular 的指令和相关组件调用$scope.$apply代表你。例如,原因是$timeout and ngClick按预期工作,是因为它们运行$scope.$apply执行回调后在内部。

更新二

如果您只是对查找调用站点感兴趣,这样的东西可以帮助您吗?

$scope.foo = {
  get bar () { return getting(); },
  set bar (value) { setting(value); }
};

var bar;

function setting (value) {
  var stack = getStack();
  console.log(value, stack);
  bar = value;
}

function getting () {
  console.log(getStack());
}

function getStack () {
  try {
    throw new Error('foo');
  } catch (e) {
    return e.stack || e;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查找更改正在监视的对象的调用站点 的相关文章

随机推荐

  • SPA 应在哪里保存 OAuth 2.0 访问令牌?

    In a 授权码授予流程中 一旦单页应用程序 SPA 等公共客户端获得 OAuth 2 0 访问令牌 SPA 应该将其保存在哪里 将访问令牌存储在区域设置存储或会话存储中会导致跨站点脚本 XSS 攻击 因此应避免这种情况 将访问令牌存储在非
  • Java - 等待 Runnable 完成

    在我的应用程序中 我在后台线程上运行以下代码 MyRunnable myRunnable new MyRunnable runOnUiThread myRunnable synchronized myRunnable myRunnable
  • primeNG 确认对话框消息显示为 html

    我需要将确认对话框消息显示为 html 这就是我的对话框在组件中的外观 this confirmationService confirm header Change user status message Do you want to ch
  • Kotlin 随机不同数字的列表

    我正在使用以下方法创建随机数列表 val randomList List 4 Random nextInt 0 100 但是 这种方法不起作用 因为我想避免重复 一种方法是洗牌Range https kotlinlang org docs
  • 使用 ifelse 将值分配给 R 中的新数据框列

    我有一个时间序列数据框 想要创建一个新的数字列 其值是现有数字列的函数 并且根据星期几列进行分配 例如 我需要类似以下代码 Day lt c Mo Mo Mo Tu Tu We We We We Th Val lt c 1000 1000
  • iOS 13.4 中 GoogleWebRTC 的视频聊天功能是否中断了?

    我可以通过 GoogleWebRTC 使用旧 iPhone 6 进行视频聊天 但无论我做什么 我似乎都无法在运行 iOS 13 4 的 iPhone XS 上渲染传入或传出视频 这是经过连续 10 天努力使其发挥作用之后的结果 我还看过一两
  • jQuery 跟踪 Google 分析事件不起作用

    我正在尝试使用谷歌分析事件 但到目前为止没有任何成功 我正在做的是使用 jQuery load 函数加载 5 个页面 我想跟踪每个负载的 下一步按钮 但看起来我做错了什么 这是下一个按钮事件代码 NextButton click funct
  • Java:对于字符串值,我们使用命令 sendKeys("String");同样,将数字数据发布到数字字段的命令是什么

    Selenium Java Web 驱动程序 如何将数字数据传递到数字字段 为了String我们使用命令的值sendKeys String 同样 将数字数据发送到数字字段的命令是什么 如果你这样做sendKeys 9 它将把数字发送到数字字
  • NotationListenerService 中的 OnListenerCOnected 未被调用

    我的应用程序仅不适用于华为 但在其他手机上可以 为什么 我的 MainActivity 中有该代码 package pl ct8 wieprz wieprz watch public class MainActivity extends A
  • Jenkins Windows 服务需要管理员权限吗?

    出于安全原因 我们认为如果 Jenkins Windows 服务以没有管理员权限的用户身份运行会更好 但是 这会导致 Jenkins 服务器启动时出现错误 java io IOException Access is denied at ja
  • JavaScript/Fancybox 错误?

    在我的页面上 我在主图像下方有 6 个框 它们使用 JS 来实现很好的淡入淡出效果 在此页面上 我还在页面开头放置了 Fancybox Load 使用 onload 来显示用户需要查看的图像 问题是当用户第一次加载页面时 其中一个框几乎不会
  • 输入字段随着您的输入而变高

    我想知道如何创建一个具有自动可调高度的文本输入 以便它变得更高以适合您的文本 例如 如果我开始输入一个段落 它会从几行扩展以适合该段落 这是我目前所拥有的 commenttext width 413px min height 22px ma
  • 安装VS2015 DotNetCore RC2

    我想将 Aspnet5 rc1 更新为 DotNetcode RC2 我无法卸载 rc1 如果我安装 rc3 我会收到以下错误 这是日志 0584 098C 2016 06 09T23 30 46 e000 Error 0x80070642
  • 更新 parse.com 中的用户对象

    我如何更新解析中的用户对象 出于安全原因 我知道必须记录用户才能修改自身 这是我的代码 但不起作用 POSThttps api parse com 1 classes User xj3QLLYy07 https api parse com
  • UIKit 和单元测试

    我正在为我的 iPhone 应用程序实现一些测试用例 我已成功设置 UnitTest Target 如下所述 iPhone开发指南 http developer apple com iphone library documentation
  • Oracle 合并语句和按源/目标条件

    我需要做一个MERGE在 Oracle 中 但我被困住了 在 SQL Server 中 我总是使用BY SOURCE and BY TARGET检查记录存在的位置 然后采取行动 我有点困惑 因为我不知道如何在 PL SQL 中实现相同的目标
  • PHP - 计算字符串中逗号的数量

    如何计算逗号在这样的字符串中出现的次数 A B C D 它应该返回 3 substr count my string 如果您希望将逗号之间的所有元素作为数组获取 您可以随时 splitted explode my string
  • 从模式创建 ERD?

    我被告知要创建一个 ERD 图 给出以下内容 The college keeps track of each student s name student number social security number address phon
  • Ansible 自定义模块:可以打印语句吗?

    我有一个 Ansible 自定义模块 用于在我的剧本中执行特定任务 我想调试该模块内的特定变量 有没有办法可以打印这个自定义模块内的任何内容 在下面的示例中 打印 Hello 请检查自定义模块中的以下代码片段 我正在通过一个jobid作为该
  • 如何查找更改正在监视的对象的调用站点

    AngularJS 允许监听对象的变化 并调用提供给 watch 函数的回调函数 对于像 ngGrid 这样使用 AngularJS 的大型库 对象经常被 监视 一旦调用了监视回调 如何追溯到导致对象发生更改的调用站点 如果不知道是什么导致