backbone js Todo application _underscore.js _.without

时间:2013-03-06 13:28:59

标签: backbone.js underscore.js

我很难理解剩下的功能在下面的代码中是如何工作的。

(注释来源:http://documentcloud.github.com/backbone/docs/todos.html

我对apply的理解是第一个参数是上下文,其余的参数是一个数组,作为参数传递给正在应用的函数。

var TodoList = Backbone.Collection.extend({
      model: Todo,
      localStorage: new Backbone.LocalStorage("todos-backbone"),
      done: function()
      {
        return this.filter(function(todo) { return todo.get('done'); });
      },
      remaining: function() 
      {
        return this.without.apply(this, this.done());
      },
});

因此:

this.without.apply(this,this.done()); - >转换为:

without(array of arguments as parameters to without function);

不将第一个参数作为数组,将2 ... n个参数从数组中删除。

我不明白这个功能是如何做有用的。我错过的解释会有所帮助。

2 个答案:

答案 0 :(得分:0)

  

this.without.apply(this,this.done()); - >转换为:without(array);

不是真的。您知道的下划线函数为第一个参数提供数组可以作为 on 主干集合的方法(如下划线链接包装器)。我们假设this.done()评估为[x, y, z],然后apply调用转换为

this.without(x, y, z);

当然,一个更高效的方法就是

return this.filter(function(todo) { return ! todo.get('done'); });
//                                         ^

答案 1 :(得分:0)

Backbone:将每个Underscore方法混合为Collection#models的代理

_.each(methods, function(method) {
    Collection.prototype[method] = function() {
      //convert arguments to array. Such as: args = [1, 2, 3]
      var args = slice.call(arguments);
      //add this.models at the begining of array. Such as: [['string'], 1, 2]
      args.unshift(this.models);
      //_[without].apply(_, [['string'], 1, 2])
      //_.without(['string'], 1, 2);
      return _[method].apply(_, args);
    };
  });