2013-11-09 2 views
1

В Backbone Todo MVC source, родной применять метод работы функции используется для вызова метода Underscore без, и я не понимаю, почему это необходимо.Зачем «применять» необходимые в этом образце приложения todo-mvc?

// Filter down the list of all todo items that are finished. 
completed: function() { 
    return this.filter(function(todo) { 
    return todo.get('completed'); 
    }); 
}, 

// Filter down the list to only todo items that are still not finished. 
remaining: function() { 
    return this.without.apply(this, this.completed()); 
}, 

Вызов без выглядывает из места, по сравнению с другими методами Underscore, такие как фильтр. Я дважды проверял с помощью базового источника, чтобы убедиться, что без не был смешан в объект Collection по-разному. Конечно, это не так.

Это как методы подчеркивания привязываться к коллекции:

_.each(methods, function(method) { 
    Collection.prototype[method] = function() { 
    var args = slice.call(arguments); 
    args.unshift(this.models); 
    return _[method].apply(_, args); 
    }; 
}); 

Как и следовало ожидать - модели из коллекции уже передается в качестве первого аргумента. Кроме того, поскольку методы вызываются в объекте Collection, это будет ограничено правильно.

Я проверил это путем изменения метода к следующему

this.without(this.completed()); 

И это прекрасно работает.

Что я здесь просматриваю?

+0

Вам не нужно применять в этом случае, так как 'this' для' .without' будет ссылаться на тот же контекст 'this' независимо от – megawac

+0

Вот что я думал. Просто кажется необычным, что это единственный метод в источнике коллекции, который использует. – linstantnoodles

+0

Это не то, что я думаю - вы читали мое сообщение? – linstantnoodles

ответ

3

Я не думаю, что вы ничего не замечаете. Это всего лишь ненужный вызов apply. Вероятно, автор изначально написал следующее (возможно, для более ранней версии магистрали).

// Filter down the list to only todo items that are still not finished. 
remaining: function() { 
    return _.without.apply(this, this.completed()); 
}, 
+0

Я только что протестировал его, и это тоже работает: 'оставаясь: function() {return this.filter (function (todo) {return! Todo.get (" completed ");});}' Любая причина, по которой я бы не хотел, Не хотите ли это сделать? –

2

Underscore's without принимает массив в качестве первого аргумента и список значений, чтобы исключить из массива для следующих аргументов. В случае Backbone массив, в котором работают методы undercore, представляет собой массив моделей внутри коллекции (collection.models), а список значений для исключения - это завершенные todos. Так что по существу

_.without.apply(collection.models, this.completed()) 

если нет apply то массив передается в качестве второго аргумента _.without, который попытается исключить массив из массива

_.without(collection.models, [completedTodo1, completedTodo2 /* , etc */]); 

но с apply, завершенная Todos передаются как отдельные аргументы именно:

_.without(collection.models, completedTodo1, completedTodo2 /* , etc. */) 

что, что вы хотите, чтобы он исключает каждую законченную TODO.

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