2012-11-01 8 views
0

В настоящее время я испытываю очень необычное поведение при использовании метода базы Backbone each. В моем приложении я разрешаю пользователям редактировать существующие модели, которые включают в себя редактирование и добавление ряда ограничений времени для этой модели. Модель и ее временные ограничения связаны с Backbone Relational. Каждый раз, когда пользователь нажимает, чтобы добавить новое временное ограничение, я добавляю модель TimeConstraint к отношениям без сохранения. Если пользователь решает отменить редактирование, все новые/несохраненные TimeConstraints должны быть удалены из отношения. Однако, когда я перебираю свою коллекцию, она, похоже, не выполняет окончательную итерацию.Backbone.Collection.each - Очень странное поведение

Я построил jsfiddle, чтобы продемонстрировать это поведение здесь: http://jsfiddle.net/richardstokes/ZzFgZ/9/

шаги, чтобы следовать являются:

  1. Нажмите кнопку "Edit Policy"
  2. Добавить 2 или более новых временных ограничений с помощью «New Время Constraint»кнопка
  3. Отменить изменения, нажав кнопку„Отменить изменения“

Вы увидите, что консоль печатает начальную длину коллекции time_constraints и длину отделки, а также промежуточную длину после удаления несохраненных моделей. Кажется, что он всегда останавливается и оставляет один элемент в коллекции, хотя они все новые/несохраненные.

Я был бы очень признателен, если бы кто-то помог мне с этой проблемой, это заставило меня застрять буквально весь день.

ответ

1

Вы удаляете элементы в виде коллекции времени. Ионы повторяются, что может вызвать неопределенное поведение. Попробуйте сначала получать список новых timeConstraints, а затем передать их в виде массива, чтобы удалить():

var toRemove = this.model.get('time_constraints').filter(function (timeConstraint) { 
    return timeConstraint.isNew(); 
}); 
this.model.get('time_constraints').remove(toRemove); 
+0

Подобно тому, как для интереса, почему бы извлекать предметы, как коллекции итерируемым быть причиной этого неопределенного поведения? Разумеется, если длина коллекции в конце итерации еще больше нуля, итерация должна продолжаться? Просто хочу понять проблему более полно. –

+0

У меня нет конкретного ответа. Согласно документации, реализация forEach выполняет цикл над элементами, которые присутствуют в начале вызова forEach (см. Https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach) и исходный код подчеркивания. В документе mozilla указано, что изменение содержимого массива в процессе итерации означает, что некоторые элементы могут не посещаться. В общем, это небезопасно (и некоторые языки, например .NET, будут предупреждать об ошибке). – Yossarian21

+0

Хорошо спасибо за понимание. Ваше решение отлично работало для меня. Будем более осторожны, чтобы не делать этого в будущем. –

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