safeApply是最佳做法吗?

时间:2016-03-11 00:02:55

标签: javascript angularjs

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

在此that code中,您可以看到是否点击了"切换displayMenu"按钮,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
};

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);
        }
    };

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

1 个答案:

答案 0 :(得分:4)

查看$$phase被认为是不好的做法。从similar topic角度开发者说:

  

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

建议的最佳做法是使用$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();
});

您可以阅读this article by Ben Nadal,了解如何在JavaScript流程中执行不同的功能。