AngularJS和WebSockets:回调函数需要$scope.$apply()才能工作



我使用AngularJS和一个电话web服务通过WebSockets进行调用。
web服务有几个回调,如Phone.onIncomingCall

当我使用此函数设置$scope变量时,视图不会自动更新,除非我在之后使用$scope.$apply

Phone.onIncomingCall = function(){
  $scope.myVar = "newValue";
  $scope.$apply(); // only works if I call this line
};

这种行为的原因是什么(是预期的),是否有一种方法可以在每个函数中使用$scope.apply() ?

Angular"不知道"你对作用域变量的更新,因为你是从Angular上下文之外更新它的。从$apply的文档:

$apply()用于从外部执行angular中的表达式角框架。(例如,从浏览器DOM事件,setTimeout, XHR或第三方库)。因为我们正在呼叫angular框架需要执行合适的作用域生命周期异常处理,执行手表。

通过在作用域上运行$apply,从$rootScope调用$digest,这将触发在$scope.myVar上注册的任何$watch。在这种情况下,如果你通过插值在视图中使用变量,这就是$watch er注册的地方。

这是预期的行为,angular内部是这样工作的。

我建议如下:

Phone.onIncomingCall = function () {
    $scope.$apply(function () {
      $scope.myVar = 'newValue';
    });
}

相关内容

  • 没有找到相关文章

最新更新