Javascript 解释为什么需要将highcharts jquery事件包装在$timeout中以访问属性

Javascript 解释为什么需要将highcharts jquery事件包装在$timeout中以访问属性,javascript,jquery,angularjs,highcharts,highcharts-ng,Javascript,Jquery,Angularjs,Highcharts,Highcharts Ng,此问题的目标 若要理解为什么我必须在事件中嵌入一个函数来包装处理程序调用,这意味着要提供。正如主题中所述,我使用angularjs和 我发现加载事件在对象中应该存在的所有数据出现之前就触发,这真的很奇怪。特别是因为我没有使用addSeries用数据填充图表。我正在手动构造整个配置对象。highcharts ng也规定了这种方法 我还发现很难接受我需要使用“$timeout”来处理似乎是比赛条件的问题。这是因为我来自C++背景,它可能不是一个竞争条件,而是现代Web开发、JavaScript和jQ

此问题的目标

若要理解为什么我必须在事件中嵌入一个函数来包装处理程序调用,这意味着要提供。正如主题中所述,我使用angularjs和

我发现加载事件在对象中应该存在的所有数据出现之前就触发,这真的很奇怪。特别是因为我没有使用
addSeries
用数据填充图表。我正在手动构造整个配置对象。highcharts ng也规定了这种方法

我还发现很难接受我需要使用“$timeout”来处理似乎是比赛条件的问题。这是因为我来自C++背景,它可能不是一个竞争条件,而是现代Web开发、JavaScript和jQuery的本质的自然怪癖之一。我对此知之甚少

如果我能理解正在发生的事情,我就能信心十足地继续前进。如果这个问题与我们使用的
highcharts ng
有关,我可以放弃它,自己包装
highcharts
。如果有更好的方法解决我的用例(见下文),也可以

我看到的行为

我开始在控制台上打印highcharts对象来解决我的问题,当我扩展它时,它显示了所有的字段。然而,当我试图开始解决我的问题时,我开始看到一些字段在我试图访问它们时实际上是未定义的

这是因为在控制台中单击展开时,所有值都已填充。但当我试图在我的加载处理程序中访问它们时,它们是未定义的

当我用angular的
$timeout
包装回调时,问题就消失了。但是为什么呢?highcharts在完成所有计算之前不应该触发加载回调,事实上,如果不计算一些未定义的字段,它无法呈现图表。那么是什么原因呢?一些html5网络工作者正在进行多线程处理吗D

海图动画。。。动画是否会导致类似种族的行为?

我找到了一些关于这个问题的参考资料,其中规定的解决方案是使用动画完成方法图表已禁用动画。但是我想一些
jquery
动画仍然可以被
highcharts
使用?如果这个处理程序可以解决我的问题,并且意味着我不必使用
$timeout
,我可以尝试连接到这个处理程序

我试图解决的问题。

我正在开发一个复杂的可视化应用程序,我需要动态重新缩放Y轴,以便Y轴上始终存在两条关键绘图线。硬编码极端值不是一个选项,因为它可以防止图表根据数据范围向外扩展

Highcharts
计算各种最大值和最小值,我想检查这些值,如果我的绘图线不在这些最大值和最小值范围内,我想设置新的极值并重新绘制图形


对这个问题有一些潜在的解决方案。不幸的是,这种方法似乎是最健壮和最简单的——也就是说,在绘图线上添加一个点并将其隐藏。我可能走这条路来节省时间。尽管我不想。

我是海格的作者

我认为问题在于,在highcharts ng中,它初始化图表,然后添加序列

这可以很容易地解决。它需要更改getMergedOptions:

目前getMergedOptions不包括series对象,因此当图表初始化时,它没有series。这种行为是可以改变的。有一些复杂的问题,比如确保系列具有ID。但这是完全可行的。我会在某个时候开始做这件事,但在这期间我很乐意接受拉请求


另一种方法是根据数据动态设置highcharts ng config对象上的x轴和y轴值。

$timeout将在执行代码后强制执行摘要循环。如果这解决了问题,我怀疑您可能正在调用Highcharts API,或者正在处理angular上下文之外的jQuery事件。如果是的话,考虑一下你是在使用HavaGug NG插件,还是直接进入HealStad本身;或者您可能正在处理jquery事件?您是否可以发布一个显示问题的基本提琴?是的,我正试图直接转到highcharts,是的,这是我的处理程序附加到的jquery事件。我订阅了图表的加载事件。我相当确定,在angular正在消化时,回调正在触发,因为我试图将所述回调封装在$scope中。$apply,因为我感到疲劳和绝望,并且从angular那里得到了一个错误,其中包含“inprog”,我猜这意味着我正在尝试在现有apply中应用$apply。这对我来说很难理解。jquery事件不应该只有在angular不活动时才能获得处理时间吗?不,jquery事件发生时才会发生。jquery事件和角度摘要周期之间没有同步。出现“inprog”错误的原因是您所处的代码是angular知道的-angular将在代码执行后调用$apply。$timeout通过向事件处理队列添加事件来解决此问题,该队列在angular完成渲染后运行。在angular means中渲染完成了所有DOM操作并计算了所有角度表达式$超时确保在渲染过程之后触发摘要循环。您给了我一些思考的东西,我想知道angular“知道”属于它的代码有多少。无论是哪种情况,阅读都会给我更多的视角。好的,这是我对这一点的理解。jqeury highcharts事件由应用程序中的highcharts ng触发