В настоящее время я испытываю очень необычное поведение при использовании метода базы Backbone each
. В моем приложении я разрешаю пользователям редактировать существующие модели, которые включают в себя редактирование и добавление ряда ограничений времени для этой модели. Модель и ее временные ограничения связаны с Backbone Relational. Каждый раз, когда пользователь нажимает, чтобы добавить новое временное ограничение, я добавляю модель TimeConstraint к отношениям без сохранения. Если пользователь решает отменить редактирование, все новые/несохраненные TimeConstraints должны быть удалены из отношения. Однако, когда я перебираю свою коллекцию, она, похоже, не выполняет окончательную итерацию.Backbone.Collection.each - Очень странное поведение
Я построил jsfiddle, чтобы продемонстрировать это поведение здесь: http://jsfiddle.net/richardstokes/ZzFgZ/9/
шаги, чтобы следовать являются:
- Нажмите кнопку "Edit Policy"
- Добавить 2 или более новых временных ограничений с помощью «New Время Constraint»кнопка
- Отменить изменения, нажав кнопку„Отменить изменения“
Вы увидите, что консоль печатает начальную длину коллекции time_constraints и длину отделки, а также промежуточную длину после удаления несохраненных моделей. Кажется, что он всегда останавливается и оставляет один элемент в коллекции, хотя они все новые/несохраненные.
Я был бы очень признателен, если бы кто-то помог мне с этой проблемой, это заставило меня застрять буквально весь день.
Подобно тому, как для интереса, почему бы извлекать предметы, как коллекции итерируемым быть причиной этого неопределенного поведения? Разумеется, если длина коллекции в конце итерации еще больше нуля, итерация должна продолжаться? Просто хочу понять проблему более полно. –
У меня нет конкретного ответа. Согласно документации, реализация forEach выполняет цикл над элементами, которые присутствуют в начале вызова forEach (см. Https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach) и исходный код подчеркивания. В документе mozilla указано, что изменение содержимого массива в процессе итерации означает, что некоторые элементы могут не посещаться. В общем, это небезопасно (и некоторые языки, например .NET, будут предупреждать об ошибке). – Yossarian21
Хорошо спасибо за понимание. Ваше решение отлично работало для меня. Будем более осторожны, чтобы не делать этого в будущем. –