Backbone.js - Todo Collection - Что именно происходит в этом возвратном заявлении?
Я оглядываюсь на список задач 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?
Ответы
Ответ 1
this
относится к коллекции.
apply
- это метод javascript-функций, который позволяет вам установить контекст метода и отправить массив значений вызывающему.
apply
ожидает контекст как первый параметр, а затем array
или подобный массиву (например, arguments
), который будет передан как параметры функции.
Вы можете сделать то же самое с .call
, за исключением того, что 2-й + params разделены запятой.
apply
и call
являются родными для javascript.
Итак...
return this.without.apply(this, this.done());
метод this.done()
возвращает массив, но использует контекст коллекции и передает в ряд значений, которые следует игнорировать с помощью метода without
. Это, в свою очередь, возвращает все тодоны, которые не выполняются в коллекции.
Пример:
_.without([1,2,3,4],1,2); === _.without.call([], [1,2,3,4], 1, 2);
Ответ 2
Я понимаю, что в этом случае использование apply
является избыточным, remaining
может быть сокращено следующим образом:
remaining: function() {
return this.without(this.done());
}
Как я понимаю, единственной причиной использования apply
является то, что вы хотите (или нужно) изменить контекстный элемент, над которым будет работать without
. В этом случае нам не нужно это делать.
Если я ошибаюсь, я действительно (действительно!) хотел бы объяснить, почему apply
необходимо здесь.
Ответ 3
apply
вызывает функцию и связывает this
в контексте этой функции с первым переданным аргументом (в данном случае экземпляром Collection TodoList
). Второй аргумент - это массив аргументов, передаваемых в without
.
Кстати, apply
не является базовым - он является родным для JavaScript.
Ответ 4
Причина этого
this.without.apply(this, this.done())
заключается в том, что "_.without" не принимает в качестве аргумента массив элементов, которые должны быть исключены как один массив ([]) аргумент
См. здесь _. без принятия массива в качестве второго аргумента
apply, который является частью JS Function.prototype, вот обходной путь для ввода исключающих элементов в один аргумент массива
Ответ 5
использование приложения в этом случае является избыточным, потому что сборники-основы выполняют задание правильно cf. http://backbonejs.org/docs/backbone.html#section-122
мы можем использовать подчеркивание следующим образом: _.without.apply(this, this.done()) или связывание с базой, как это: this.without(this.done), используя базовое связывание.
Ответ 6
Пожалуйста, взгляните на документ подчёркивания:
например:
without_.without(array, [* values])
Возвращает копию массива со всеми экземплярами удаленных значений.
_. без ([1, 2, 1, 0, 3, 1, 4], 0, 1);
= > [2, 3, 4]
Ответ 7
Я изменил функцию на это и получил тот же результат в приложении списка TODO:
remaining: function () {
return this.filter(function (todo) {
return !todo.get('done');
});
}
Я до сих пор не понял, как применять стал методом без, я знал, что применить функцию Javascript, но затем я прочитал документацию для применения и понял, что в этом случае без него не было объектно-ориентированного (см. http://underscorejs.org/#chain).
Фактически, применение может быть передано null вместо this в качестве контекста, и это не изменит результат, потому что он вообще не используется:
return this.without.apply(null, this.done());
Обратите внимание, что первый этот представляет собой фактический набор моделей и без использования второго аргумента в приложении, который является массивом выполненных (завершенных) задач, создает массив ожидающих задач todo.
Кстати, последняя версия приложения TODO переименовывает функцию, выполненную для завершенной.
Ответ 8
Здесь 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().
Ответ 9
Функция without
нуждается в списке элементов для удаления из this
.
this.completed()
возвращает массив, поэтому это не то, что ожидает функция without
.
apply
- это встроенная функция JavaScript, которая вызывает функцию, определяющую контекст this
как первый аргумент, и массив как второй аргумент. Аргумент передается исходной функции в качестве аргументов списка.
В этом случае apply
передает аргументы without
в this.completed()
, ожидая without
.
В заключение, в этом случае необходимо apply
.
Ответ 10
Извините, я полный новичок @этот материал, но не мог fn.remaining(также) быть объявлен как:
return this.filter(function (todo) {return! todo.get( "done" )})
Указание этого как запрос на разъяснение, а не альтернативное объявление:)
(править: не удалось выделить "!" перед "todo.get..." )