我正在努力使用指令来应用更多的最佳实践,但我对从指令应用范围值的最佳方法有一些疑问。
在此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是最佳做法吗? 如果没有,那么实现我想要的最好方法是什么?
答案 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流程中执行不同的功能。