我使用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';
});
}