gpt4 book ai didi

javascript - 消除根范围摘要调用的抖动

转载 作者:行者123 更新时间:2023-11-27 23:58:36 27 4
gpt4 key购买 nike

如果我立即连续调用 $scope.$apply() 十次,我认为将会发生十个根范围摘要。

我们是否可以说,如果对 $scope.$apply() 的调用被反跳,以便尾随调用始终完成,那么应用程序的最终状态将与反跳相同没有生效?

考虑到前一个摘要刚刚完成,我们能谈谈连续根范围摘要的持续时间吗?

编辑:

我想澄清我的问题的目的。

假设我有一个 Controller MyController,其中为指令 MyDirective 的每个实例实例化了一个实例。

这些 Controller 实例监听事件 my-event 并在每次引发 my-event 时触发根范围摘要。

十个 MyDirective 实例通过 ng-repeat 呈现给 UI。

另一个组件引发了一个事件my-event。然后,十个 MyController 实例中的每一个都会触发根范围摘要。

如果我们把这种事态的理智放在一边,我的问题是:如果我对 MyController 所做的根范围摘要尝试进行反跳,并确保尾随尝试始终得到调用后,程序的正确性是否保持?

var service = require('my-service');

function MyController($scope) {
this._$scope = $scope;
myService.on('my-event', this.triggerRootScopeDigest.bind(this));
}

MyController.prototype.triggerRootScopeDigest = function() {
this._$scope.apply();
}

最佳答案

编辑后的问题仍然指向 $applyAsync$evalAsync 作为您的解决方案。

这是一个比较 $apply()$applyAsync() 的示例 fiddle : http://jsfiddle.net/635pvkkt/

您会注意到,通过 ngRepeat 添加了 10 个项目,每个项目都会监视一个 doApply 事件和一个 doApplyAsync 事件,以触发各自的职能。

当您单击广播 doApply 的按钮时,它会触发 10 个 $digest 调用,每个调用都执行指令工作(在本例中,作为简单的 console .log)。

但是,doApplyAsync 广播会导致所有 10 个指令在单个 $digest 中完成其工作。

当然,去抖回调也可以工作。您可以向每个指令传递一个对附加到父 Controller 作用域的去抖函数的引用。如果该去抖功能正常工作并且具有足够长的去抖时间,则它只会应用一次。在某些情况下,这是首选的,但原始问题感觉足够简单(假设触发 $digest 是事件的主要目标),用 $apply 替换 $ applyAsync (或 $evalAsync,具体取决于语义)似乎更合适。

编辑:虽然结果完全相同,但这个 fiddle 更准确,因为它直接触发元素上的真实 DOM 事件:http://jsfiddle.net/uh9wxxho/

关于javascript - 消除根范围摘要调用的抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32036780/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com