【问题标题】:AngularJS and WebSockets: Callback function needs $scope.$apply() to workAngularJS 和 WebSockets:回调函数需要 $scope.$apply() 才能工作
【发布时间】:2014-07-27 21:13:38
【问题描述】:
我正在使用 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()?
【问题讨论】:
标签:
javascript
angularjs
websocket
【解决方案1】:
Angular“不知道”您对范围变量所做的更新,因为您是从 Angular 上下文之外对其进行更新的。来自$apply 的文档:
$apply() 用于从外部以角度执行表达式
角度框架。 (例如来自浏览器 DOM 事件,
setTimeout、XHR 或第三方库)。因为我们正在呼唤
我们需要执行适当的范围生命周期的角度框架
异常处理,执行手表。
通过在作用域上运行$apply,从$rootScope 调用$digest,这将触发在$scope.myVar 上注册的任何$watchers。在这种情况下,如果您通过插值在视图中使用变量,这就是注册 $watcher 的位置。
【解决方案2】:
这是预期的行为,角度在内部是这样工作的。
我推荐以下:
Phone.onIncomingCall = function () {
$scope.$apply(function () {
$scope.myVar = 'newValue';
});
}