2014-10-05 7 views
0

Я хочу фильтровать Backbone collection с использованием метода _.without.Почему метод «без» возвращает разные результаты в зависимости от контекста?

возвращает правильные результаты (только завершена Todos) в этом виде вызова:

return this.without.apply(this, this.active()); 

, но не в этом одном:

return _.without(this.models, this.active()); 

В последнем заявлении он возвращает массив, содержащий ВСЕ модели из коллекция.

Невозможно использовать методы Underscore напрямую, но только через контекст Backbone's this?

Как сделать работу 2-го заявления?

todos.js

var app = app || {}; 

var Todos = Backbone.Collection.extend({ 
    model: app.Todo, 
    active: function() { 
    return this.filter(function(todo) { 
     return todo.get('completed') === false; 
    }); 
    }, 
    completed: function() { 
    return this.without.apply(this, this.active()); 
    // return _.without(this.models, this.active()); <--- Problem is here 
    } 
}); 

app.Todos = new Todos(); 

ДОБАВЛЕНО ПОЗЖЕ:

С _ .without метод не принимает массив в качестве второго параметра _.difference больше подходит для моей задачи.

return _.difference(this.models, this.active()); 

ответ

2

Проблема заключается в том, что вы используете метод without Undersore ненадлежащим образом. Он ожидает скаляр значение для второго параметра, тогда как вы проходите array.

На самом деле вам не нужно _.without.

Не пытайтесь повторно использовать метод active в методе completed. Это плохой практики. completed метод должен быть реализован по тому же подходу, что и active.

Так что код должен выглядеть следующим образом:

var Todos = Backbone.Collection.extend({ 
    model: app.Todo, 
    active: function() { 
    return this.filter(function(todo) { 
     return todo.get('completed') === false; 
    }); 
    }, 
    completed: function() { 
    return this.filter(function(todo) { 
     return todo.get('completed') === true; 
    }); 
    } 
}); 

UPDATE:

Q: Так почему первый вызов (который использует apply) работает?

А: Поскольку apply метод преобразует this.active() результат, который array, в список значений, который в точности ожидаемого _.without методом. Таким образом, этот вызов работает в отличие от второго, который не эквивалентен первому.

Однако, как упомянуто выше, такой тип повторного использования кода сильно не рекомендуется, так как он скрывает логику кода, кроме служебных данных обработки двойного массива.

+0

Но как работает _.without в первом виде вызова, если он ожидает скалярное значение? this.without.apply (this, this.active()) – yaru

+0

> Это плохая практика. Почему так? Это повторное использование кода. Сухой принцип. – yaru

+0

_Почему так? Это повторное использование кода. Не для вашего дела. – hindmost

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