Sockets 如何在AngularJS+Socket.IO中处理双向模型视图更新
我有一段代码,处理模型的更新Sockets 如何在AngularJS+Socket.IO中处理双向模型视图更新,sockets,angularjs,Sockets,Angularjs,我有一段代码,处理模型的更新 // Edit todo. $scope.editTodo = function(todo) { var newTitle = prompt('Edit todo', todo.title); if (newTitle) { todo.title = newTitle; todo.$update(); socket.emit('update_todo', todo); } } 其中“todo
// Edit todo.
$scope.editTodo = function(todo) {
var newTitle = prompt('Edit todo', todo.title);
if (newTitle) {
todo.title = newTitle;
todo.$update();
socket.emit('update_todo', todo);
}
}
其中“todo”参数是从视图发送的
然后我有了这段代码,它侦听“update_todo”事件,并更新其他活动套接字/客户端上的模型视图
socket.on('todoUpdated', function(data) {
for (var i in $scope.todos) {
if ($scope.todos[i]._id == data._id) {
$scope.todos[i] = data;
}
}
});
但是,假设我刚刚在client1中编辑了一个模型,切换到client2,并尝试编辑同一个模型,则会出现以下错误:
TypeError: Object #<Object> has no method '$update'
怎么办?还有,有没有更智能/更好的方法来更新模型视图,而不是执行for循环?非常感谢您的帮助:我的解决方案:
socket.on('todoUpdated', function(data) {
var newStatus = data.completed;
for (var i in $scope.todos) {
if ($scope.todos[i]._id == data._id) {
$scope.todos[i].completed = newStatus;
}
}
});
如果有更好的方法,请告诉:如何调用editTodo方法?你能为你的代码提供一个Plunker/JSFIDLE脚本吗?我的代码就是这样:@MichaelBenford有什么建议吗我想你的答案是正确的。之前,您将Angular创建的Todo对象替换为SocketIO发送的Todo对象,该对象没有方法$update。作为补充说明,您可以尝试将待办事项列表设置为哈希表,这样您就不必为了找到特定的待办事项而对其进行迭代。您能为我指出一个方向吗?不确定您所说的哈希表是什么意思?我的意思是,您可以尝试更改代码,以便通过执行$scope.todos[data.\u id]而不是在列表上迭代来获得todo。这是一个小优化;也许不值得费心去修改代码,但是Angular的过滤和排序将不起作用,除非对象是数组。