我正在使用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()
?
答案 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';
});
}