Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从服务器推送websocket数据后Angularjs模型发生变化_Javascript_Websocket_Angularjs_Socket.io - Fatal编程技术网

Javascript 从服务器推送websocket数据后Angularjs模型发生变化

Javascript 从服务器推送websocket数据后Angularjs模型发生变化,javascript,websocket,angularjs,socket.io,Javascript,Websocket,Angularjs,Socket.io,在服务器推送websocket之后,我尝试更改我的角度模型。每次服务器提供新数据时,如何更改$scope.contacts等值 我不确定是否可以使用$apply。我知道我可以访问DOM元素,检索范围,然后更改值,但是应该有更好的解决方案 我对一个从外部更新角度模型而不创建角度模块的解决方案非常感兴趣,因为我使用的是发出更改事件的相对数据源。在Backbone.js中没有简单的方法可以做到这一点,您可以说: var book = new Backbone.Model({ title: 'value

在服务器推送websocket之后,我尝试更改我的角度模型。每次服务器提供新数据时,如何更改
$scope.contacts
等值

我不确定是否可以使用
$apply
。我知道我可以访问DOM元素,检索范围,然后更改值,但是应该有更好的解决方案

我对一个从外部更新角度模型而不创建角度模块的解决方案非常感兴趣,因为我使用的是发出更改事件的相对数据源。在Backbone.js中没有简单的方法可以做到这一点,您可以说:

var book = new Backbone.Model({ title: 'value' });
book.set("title", "A Scandal in Bohemia");
我想在angularjs中看到的是:

function MyController($scope) {
    $scope.contacts = [];
}

datasource changed -> function () {
    MyController.set('contacts', 'value'); // change angular scope property
}
照下面的方法做

 socket.onmessage = function (event) {
     scope.$apply(function(){
       // modify scope values here 
     }
    };

查看socket.io角度服务:

angular.module('app')
.factory('socket',['$rootScope',函数($rootScope){
var socket=io.connect();
返回{
on:函数(eventName,回调){
socket.on(eventName,函数(){
var args=参数;
$rootScope.$apply(函数(){
callback.apply(套接字,args);
});
});
},
emit:函数(eventName、数据、回调){
emit(事件名、数据、函数(){
var args=参数;
$rootScope.$apply(函数(){
如果(回调){
callback.apply(套接字,args);
}
});
})
}
};
}]);
以及使用它的控制器:

angular.module('app')
.controller('controller',['$scope','socket',function($scope,socket){
socket.emit('寄存器')
socket.on('register',函数(数据){
$scope.data=数据;
});
}]);

好吧,有标记的答案肯定不是OP要求的“简单方法”。这里有一个更简单的解决方案

在您自己的JavaScript代码中的任意位置检索范围:

var scope = angular.element($("#elementID")).scope();
更改Angular
$scope
变量中的值,但从外部JavaScript:

scope.$apply(function() {
    scope.yourArrayForExample.push({name: 'New, external value'});
});

这是一个。

是的,这是可能的$apply@Jimbo你的答案正是我在问题中所描述的。我正在寻找一种更简单的方法,但我认为编写自己的factory模块是最好的解决方案。如果我错了,请纠正我的错误,但当我检索到范围后,我只需通过
scope.variable='value'
更改值即可。我的问题是如何以一种简单的方式检索我想要更改的范围。你是否创建了一个角度服务,用于制作websocket request+1 Great find@Ajaybeniwal-我将上面的代码与在你自己的JS中检索元素范围的功能结合起来,并将其放入下面的新答案中:)这是一个非常好的示例,但它会在我的情况下不起作用,因为我正在与客户机上的集合同步数据,并且这些集合发出更改事件。我可以改为使用代码来处理您的建议,但我真正想要的是
scope.contacts=db.collection('contacts')。find('favorites')
并在每次更新我的集合时设置angular model属性,然后调用此代码。您在客户端上使用的是哪个db?
find()
是否具有回调函数?你能显示客户的完整来源吗?