Подтвердить что ты не робот

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?

4b9b3361

Ответ 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..." )