2016-06-30 1 views
0

У меня есть коллекция какПоддерживать индекс, а фильтр модели из коллекции Backbone

var Book = Backbone.Model.extend({ 
    defaults:{ 
     name: '', 
     author: '' 
    } 
}); 

var BookCollection = Backbone.Collection.extend({ 
    model: Book 
}); 


/*** Populate the Collection ***/ 

var b1 = new Book({name: 'Java programming', author: 'John Doe'}); 
var b2 = new Book({name: 'C# programming', author: 'Alice Jane'}); 
var b3 = new Book({name: 'SQL in depth', author: 'James Wayne'}); 

var bkCollection = new BookCollection(); 

bkCollection.push(b1); 
bkCollection.push(b2); 
bkCollection.push(b3); 

//I want to remove all models where name contains word 'programming' 

var RESTRICTED = 'programming'; 

bkCollection.each(function(book){ 
    if(book.get('name').indexOf(RESTRICTED) > -1){ 
     bkCollection.remove(book); 
    } 
}); 

Тем не менее, я в конечном итоге получить неопределенную модель и название программирования в некоторых случаях, когда имеется большое количество записей (> 100)

Каков правильный способ отфильтровать модель из коллекции в Backbone?

ответ

0

Линия bkCollection.remove(book); удаляет модель из коллекции, поскольку она итерации над ней. Вместо этого нажмите модели в массив, а затем удалите из коллекции.

var Book = Backbone.Model.extend({ 
 
    defaults:{ 
 
     name: '', 
 
     author: '' 
 
    } 
 
}); 
 

 
var BookCollection = Backbone.Collection.extend({ 
 
    model: Book 
 
}); 
 

 

 
/*** Populate the Collection ***/ 
 

 
var b1 = new Book({name: 'Java programming', author: 'John Doe'}); 
 
var b2 = new Book({name: 'C# programming', author: 'Alice Jane'}); 
 
var b3 = new Book({name: 'SQL in depth', author: 'James Wayne'}); 
 

 
var bkCollection = new BookCollection(); 
 

 
bkCollection.push(b1); 
 
bkCollection.push(b2); 
 
bkCollection.push(b3); 
 

 
//I want to remove all models where name contains word 'programming' 
 

 
var RESTRICTED = 'programming'; 
 

 
var booksToRemove = new Array(); //cfa: the array that will hold the books to be removed 
 
bkCollection.each(function(book){ 
 
    if((book.get('name').indexOf(RESTRICTED)) > -1){ 
 
     booksToRemove.push(book); // cfa: push the model into the array 
 
    } 
 
}); 
 

 
bkCollection.remove(booksToRemove); // remove from collection 
 

 
console.log('Updated Collection is ' + JSON.stringify(bkCollection));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

0

Выпуск удаления модели во время итерации, как bvoleti уже упоминалось. Вы можете легко исправить это, используя встроенные методы, такие как filter, а не each:

var RESTRICTED = 'programming'; 
var matches = bkCollection.filter(function(book){ 
    return book.get('name').indexOf(RESTRICTED) > -1; 
}); 
bkCollection.remove(matches); 
Смежные вопросы