Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Sockets 如何在AngularJS+Socket.IO中处理双向模型视图更新_Sockets_Angularjs - Fatal编程技术网

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的过滤和排序将不起作用,除非对象是数组。