2013-08-31 4 views
1

Так что у меня этот кусок кода, который обрабатывает обновление моделиКак обрабатывать 2-полосное обновление вида модели в AngularJS + Socket.IO

// 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? Помощь очень ценится :)

+0

Как вы звоните в 'метод editTodo'? Не могли бы вы предоставить скрипт Plunker/jsFiddle своим кодом? –

+0

Это в значительной степени, как выглядит мой код: http://jsfiddle.net/HB7LU/307/ – dgsunesen

+0

@MichaelBenford получил предложения? :) – dgsunesen

ответ

0

Мое решение:

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; 
     } 
    } 
    }); 

Кто-нибудь есть лучший способ сделать это, пожалуйста, сообщите :)

+0

Я думаю, ваше решение правильно. Раньше вы заменяли объект Todo, созданный Angular, на тот, который был отправлен SocketIO, у которого не было метода '$ update'. В качестве побочной заметки вы можете попытаться сделать список todo хеш-таблицей, чтобы вам не нужно было перебирать ее, чтобы найти конкретное todo. –

+0

Не могли бы вы указать мне направление? Не знаете, что вы понимаете под хэш-столом? – dgsunesen

+0

Что я имел в виду, так это то, что вы можете попробовать изменить код, чтобы вы могли получить todo, выполнив '$ scope.todos [data._id]' вместо повторения в списке. Это небольшая оптимизация; возможно, это не стоит менять код. –

Смежные вопросы