Я оглядываюсь на список дел Backbone и у меня вопрос о коллекции.
Вот код:
window.TodoList = Bacbone.Collection.extend({
model: Todo,
localStorage: new Store("todos"),
done: function() {
return this.filter(function(todo){return todo.get("done")})
},
remaining: function() {
return this.without.apply(this, this.done());
}
})
Я понимаю все, что здесь происходит, за исключением функции «Остающийся».
Оператор return: return this.without.apply (this, this.done ());
использует прокси для метода подчеркивания - _. without
Согласно документам Underscore, вот для чего это нужно:
without_.without (array, [* values ]) Возвращает копию массива с все экземпляры значений удалены. === используется для равенства контрольная работа.
_. Без ([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Итак, я понял, что он говорит о том, чтобы вернуть все в коллекции без атрибута 'done' со значением 'true'.
Чего я не понимаю, так это привязанной к нему функции «применить». Этого нет в документации Backbone или Underscore. По крайней мере, нигде не найду.
Может ли кто-нибудь подробно объяснить, что происходит с этими элементами в операторе Return?
Пожалуйста, взгляните на подчеркивание doc: вот так:
without_.without (array, [* values]) Возвращает копию массива со всеми удаленными экземплярами значений.
_. Без ([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Здесь this.without () делегирует функцию _.without (). _.without () требует массив и элементы как параметры, а не как массив. Используя apply (), примените вызовы _.without () правильным образом.
var obj = {
f1: function(a,b,c){}
};
Now obj.f1(1,2,3) == obj.f1.apply(obj, [1,2,3]).
С помощью этой информации this.without (this.complete ()) передает массив в метод без. Но без метода необходимо, чтобы отдельные элементы передавались в качестве аргументов. Это можно сделать с помощью Function.apply ().
Извините, я новичок в этом деле, но fn.remaining (также) не может быть объявлен как:
return this.filter (function (todo) {return! Todo.get ("done")})
Обозначая это как просьбу о разъяснении, а не как альтернативное объявление:)
(edit: не удалось выделить жирным шрифтом '!' before 'todo.get ... ')
Причина этого
this.without.apply(this, this.done())
заключается в том, что «_.without» не принимает в качестве аргумента массив элементов, которые должны быть исключены в качестве одного аргумента массива ([])
См. Здесь _. Без принятия массива в качестве второго аргумента
apply , который является частью JS Function.prototype, здесь Обходной путь для вставки исключающих элементов в один аргумент массива
Насколько я понимаю, в этом случае использование apply
является излишним, remaining
может быть сокращено следующим образом:
remaining: function() {
return this.without(this.done());
}
Насколько я понимаю, единственная причина использовать apply
, если вы хотите ( или нужно ) изменить контекстный элемент, над которым будет работать without
. В этом случае нам не нужно этого делать.
Если я ошибаюсь, мне бы очень (очень!) Хотелось бы объяснить, почему apply
здесь необходимо.