Backbone.js - Коллекция Todo - Что именно происходит в этом операторе возврата?

Я оглядываюсь на список дел 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?

23
задан PhillipKregg 4 February 2012 в 00:42
поделиться

5 ответов

Пожалуйста, взгляните на подчеркивание doc: вот так:

without_.without (array, [* values]) Возвращает копию массива со всеми удаленными экземплярами значений.

_. Без ([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]

0
ответ дан 29 November 2019 в 01:54
поделиться

Здесь 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 ().

0
ответ дан 29 November 2019 в 01:54
поделиться

Извините, я новичок в этом деле, но fn.remaining (также) не может быть объявлен как:

return this.filter (function (todo) {return! Todo.get ("done")})

Обозначая это как просьбу о разъяснении, а не как альтернативное объявление:)

(edit: не удалось выделить жирным шрифтом '!' before 'todo.get ... ')

-1
ответ дан 29 November 2019 в 01:54
поделиться

Причина этого

this.without.apply(this, this.done())

заключается в том, что «_.without» не принимает в качестве аргумента массив элементов, которые должны быть исключены в качестве одного аргумента массива ([])

См. Здесь _. Без принятия массива в качестве второго аргумента

apply , который является частью JS Function.prototype, здесь Обходной путь для вставки исключающих элементов в один аргумент массива

1
ответ дан 29 November 2019 в 01:54
поделиться

Насколько я понимаю, в этом случае использование apply является излишним, remaining может быть сокращено следующим образом:

remaining: function() {
  return this.without(this.done());
}

Насколько я понимаю, единственная причина использовать apply, если вы хотите ( или нужно ) изменить контекстный элемент, над которым будет работать without. В этом случае нам не нужно этого делать.

Если я ошибаюсь, мне бы очень (очень!) Хотелось бы объяснить, почему apply здесь необходимо.

6
ответ дан 29 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: