首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >safeApply是最佳实践吗?

safeApply是最佳实践吗?
EN

Stack Overflow用户
提问于 2016-03-11 00:02:54
回答 1查看 3.3K关注 0票数 5

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

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

代码语言:javascript
运行
复制
scope.yolo = function () {
    scope.ctrl.toggle(); // COMMENT ME
    //scope.ctrl.toggleApply(); // UNCOMMENT ME
};

致:

代码语言:javascript
运行
复制
scope.yolo = function () {
    //scope.ctrl.toggle(); // COMMENT ME
    scope.ctrl.toggleApply(); // UNCOMMENT ME
};

displayMenu div将关闭。

现在,问题是我被迫编写了两个函数,一个带有"$scope.$apply“,一个没有,这显然不是一个聪明的方法.除非我使用safeApply,比如:

代码语言:javascript
运行
复制
 $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是最佳实践吗?如果没有,实现我想要的目标的最好方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-11 00:26:49

查看$$phase被认为是不好的做法。从相似话题的角度发展者已经说过:

由于将来的防伪原因,您不应该使用$$phase。

推荐的最佳实践是使用$timeout$evalAsync,这两种方法都推迟了代码的执行。本质上,这两个函数都将在一个新的$digest循环中执行,因此您不必亲自手动调用$apply。如果您只需要在$evalAsync场景中更新一些代码,那么大多数情况下您可能可以使用safeApply。

代码语言:javascript
运行
复制
scope.$evalAsync(function(scope) {
  // run the toggle function without caring if you're in the digest or not
  scope.ctrl.toggle();
});

您可以阅读本文作者:本·纳达尔,查看如何在JavaScript进程中执行不同的函数。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35929776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档