safeApply是最佳实践吗?

Jac*_*nat 3 javascript angularjs

我正在尝试与指令合作以应用更多的最佳实践,但是我对从指令中应用范围值的最佳方法有一些疑问。

在这个小提琴演示中,您可以看到是否单击“ Toggle displayMenu”按钮,div仍处于打开状态。如果您在指令的代码中切换第7-8行:

scope.yolo = function () {
    scope.ctrl.toggle(); // COMMENT ME
    //scope.ctrl.toggleApply(); // UNCOMMENT ME
};
Run Code Online (Sandbox Code Playgroud)

至 :

scope.yolo = function () {
    //scope.ctrl.toggle(); // COMMENT ME
    scope.ctrl.toggleApply(); // UNCOMMENT ME
};
Run Code Online (Sandbox Code Playgroud)

displayMenu div将关闭。

现在,问题是我被迫编写2个函数,其中一个带有“ $ scope。$ apply”,而另一个没有,这显然不是一种聪明的方法……除非我使用safeApply像这样:

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

是safeApply是最佳实践吗?如果没有,实现我想要的最佳方法是什么?

Ste*_*ert 5

查看会$$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();
});
Run Code Online (Sandbox Code Playgroud)

您可以阅读Ben Nadal的这篇文章,以了解如何在JavaScript流程中执行不同的功能。