是否安全应用是最佳实践

Is safeApply is best practice?

本文关键字:最佳 安全 应用 是否      更新时间:2023-09-26

我正在尝试更多地使用指令来应用更多的最佳实践,但我对从指令应用范围值的最佳方法有一些疑问。

在这个小提琴演示中,您可以看到如果您单击"切换显示菜单"按钮,div 仍然处于打开状态。如果您在指令代码中切换第 7-8 行:

scope.yolo = function () {
    scope.ctrl.toggle(); // COMMENT ME
    //scope.ctrl.toggleApply(); // UNCOMMENT ME
};

自:

scope.yolo = function () {
    //scope.ctrl.toggle(); // COMMENT ME
    scope.ctrl.toggleApply(); // UNCOMMENT ME
};

显示菜单div 将关闭。

现在,问题是我被迫编写 2 个函数,一个带有"$scope.$apply",一个没有,这显然不是一个聪明的方法......除非我使用安全申请,例如:

 $rootScope.safeApply = function(fn) {
        var phase = this.$root.$$phase;
        if(phase == '$apply' || phase == '$digest') {
            if(fn && (typeof(fn) === 'function')) {
                fn();
            }
        } else {
            this.$apply(fn);
        }
    };

安全应用是最佳实践吗?如果没有,完成我想要的最好方法是什么?

查看$$phase被认为是不好的做法。从类似的主题来看,角度开发人员说:

出于面向未来的原因,您不应该使用 $$phase

建议的最佳做法是使用 $timeout 或 $evalAsync,它们都会延迟代码的执行。从本质上讲,这两个函数都将在新的$digest周期中执行,因此您不必自己手动调用$apply。大多数情况下,如果您只需要在 safeApply 方案中更新一些代码,则可以使用 $evalAsync。

scope.$evalAsync(function(scope) {
  // run the toggle function without caring if you're in the digest or not
  scope.ctrl.toggle();
});

你可以阅读 Ben Nadal 的这篇文章,看看不同的函数是如何在 JavaScript 过程中执行的。