Javascript 使用$timeout强制执行,这是一种不好的做法吗?

Javascript 使用$timeout强制执行,这是一种不好的做法吗?,javascript,angularjs,ionic-framework,Javascript,Angularjs,Ionic Framework,我和爱奥尼亚3一起工作。所以我在控制器上有这个代码,它可以工作 $scope.note = 'Lorem...'; $rootScope.$on('Active',function() { $timeout(function() { $scope.note = 'test'; },0); }); 但为什么这不起作用呢 $scope.note = 'Lorem...'; $rootScope.$on('Active',function() { $sc

我和爱奥尼亚3一起工作。所以我在控制器上有这个代码,它可以工作

$scope.note = 'Lorem...';

$rootScope.$on('Active',function() {
    $timeout(function() {
        $scope.note = 'test';
    },0);
}); 
但为什么这不起作用呢

$scope.note = 'Lorem...';

$rootScope.$on('Active',function() {
    $scope.note = 'test';
}); 

最好的方法是什么?

当视图没有收到控制器更改的通知时,会发生这种情况。这通常发生在ng重复数组/对象或不使用全局对象的窗体内部。$timeout解决方案有效,或者您可以调用$scope.$apply()。有关更多信息,请参阅本文档:


在这种情况下,这可能被认为是一种不好的做法。自发使用
$timeout
通常表示开发人员不知道代码是在摘要周期内运行还是在摘要周期外运行,并试图确保安全

关于这不起作用的解释不在发布代码的范围内,但原因是此代码在摘要之外运行。这取决于触发范围事件的位置,这是开发人员首先应该关心的,因为范围事件不一定发生在摘要周期内

如果已知事件发生在摘要之外,则与摘要相关的代码应使用
$apply
包装:

$scope.$on('Active',function() {
    $scope.$apply(function() {
        $scope.note = 'test';
    });
}); 
如果已知事件发生在摘要内部和外部,则应使用
$evalAsync
包装代码:

$scope.$on('Active',function() {
    $scope.$evalAsync(function() {
        $scope.note = 'test';
    });
});
$timeout(…)
应该仅在需要其行为时使用,即一个或多个勾号延迟和一个摘要


正如@georgeawg所建议的,在控制器中使用
$rootScope
作为全局事件总线也是一种不好的做法(它们可以访问子作用域)。这基本上是一种可能导致内存泄漏的反模式。考虑到事件是
$broadcast
ed,它将传播到子作用域。根据经验,它应该是(…)上的
$scope.$on
,除非有理由特别在
$rootScope
上进行编辑。

@georgeawg为什么要进行这些编辑?如果事件是从另一个作用域发出的
$emit
ted,则上述代码将无法正常工作。在这里使用$rootScope是否合理取决于OP。将侦听器放在$rootScope上有内存泄漏的风险。最好从$rootScope开始$broadcast,因为广播不会附加听众。@georgeawg我同意这一点,但此建议应作为评论或答案的一部分发布。问题的文本中没有错误,因为这正是OP拥有的代码。