this.each не перебирает коллекцию правильно - PullRequest
2 голосов
/ 20 июня 2011

Я только начал использовать backbone.js и добавляю несколько базовых методов для расширения коллекции, позволяя мне перебирать коллекцию и сохранять все модели, а также перебирать коллекцию для уничтожения всех моделей. Я понимаю, что массовые обновления не являются RESTful, но я обновляю только локальное хранилище, поэтому не думал, что будет многократное обновление.

В моем базовом приложении коллекция насчитывает 9 моделей. Когда я вызываю collection.saveModels (), он правильно регистрирует длину коллекции и правильно сохраняет все модели.

Когда я вызываю collection.deleteModels (), он корректно записывает длину коллекции, но пропускает каждую вторую модель (то есть 2-ю, 4-ю, 6-ю, 8-ю). Каждый раз, когда удаляется нажатие, он продолжает удалять только нечетный индексированный элемент, причем последним удаляемым элементом является восьмой исходный элемент.

Возможно ли, что я неправильно использую каждую функцию, несмотря на то, что она отлично работает при сохранении?

_.extend(Backbone.Collection.prototype, Backbone.Events, {
saveModels  :   function() {
    console.log(this.length);
    this.each(function(model){
        console.log('saving model ' + model.get('name'));
        model.save();
    });
},
deleteModels    :   function() {
    console.log(this.length);
    this.each(function(model){
        console.log('deleting model ' + model.get('name'));
        model.destroy();
    });
}
});

и они называются так: mycollection.saveModels(); и mycollection.deleteModels();

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

Ответы [ 4 ]

8 голосов
/ 14 июня 2012

Код, опубликованный bradgonesurfing, на самом деле не работает, так как метод clone не возвращает объект подчеркивания.Правильный способ - использовать метод _. Chain с, чтобы каждый метод был цепным.

_.chain(App.articles.models).clone().each(function(model){
  console.log('deleting model ' + model.get('name'));
  model.destroy();
});
5 голосов
/ 21 октября 2011

Код ниже работал отлично для меня:

  destroyAll: function (options) {
    while (this.models.length > 0) {
        this.models[0].destroy(options);
    }    
}
5 голосов
/ 22 июня 2011

Каждый раз, когда вы вызываете model.destroy (), он удаляет себя из коллекции.Каждый итератор этого не знает.Сделайте что-то вроде следующего.

_.chain(App.articles.models).clone().each(function(model){
  console.log('deleting model ' + model.get('name'));
  model.destroy();
});

Backbone имеет доступ к утилитам underscore.js.Сначала клонируйте массив моделей, затем итерируйте его, а затем уничтожьте каждую модель.Должно работать

0 голосов
/ 30 июня 2011

Это реализация комментария kinakuta's, который я в итоге использовал.

destroy_models  :   function() {
    for (var i = this.length - 1; i > -1; i -=1){
        this.getByCid('c'+i).destroy();
    }
}
...