我正在尝试使用更多的指令来应用更多的最佳实践,但对于从指令中应用范围值的最佳方法,我有一些疑问。
在这个小提琴演示中,您可以看到如果单击"Toggle“按钮,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将关闭。
现在,问题是我被迫编写了两个函数,一个带有"$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是最佳实践吗?如果没有,实现我想要的目标的最好方法是什么?
发布于 2016-03-11 00:26:49
查看$$phase被认为是不好的做法。从相似话题的角度发展者已经说过:
由于将来的防伪原因,您不应该使用$$phase。
推荐的最佳实践是使用$timeout或$evalAsync,这两种方法都推迟了代码的执行。本质上,这两个函数都将在一个新的$digest循环中执行,因此您不必亲自手动调用$apply。如果您只需要在$evalAsync场景中更新一些代码,那么大多数情况下您可能可以使用safeApply。
scope.$evalAsync(function(scope) {
// run the toggle function without caring if you're in the digest or not
scope.ctrl.toggle();
});您可以阅读本文作者:本·纳达尔,查看如何在JavaScript进程中执行不同的函数。
https://stackoverflow.com/questions/35929776
复制相似问题