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

时间:2014-06-06 14:41:33

标签: javascript angularjs websocket

我正在使用AngularJS和电话网络服务通过WebSockets拨打电话 Web服务有几个回调,例如Phone.onIncomingCall

当我使用此功能设置$scope变量时,除非我立即使用$scope.$apply,否则视图不会自动更新。

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

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

2 个答案:

答案 0 :(得分:3)

Angular是"意识不到"您已经制作的范围变量的更新,因为您要从Angular上下文之外更新它。来自$apply的文档:

  

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

通过在范围上运行$apply$digest会调用$rootScope,这将触发$watch上注册的所有$scope.myVar个人。在这种情况下,如果您通过插值在视图中使用变量,则这是注册$watch的位置。

答案 1 :(得分:1)

这是预期的行为,角度就像内部一样。

我建议如下:

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