为什么在此主干 todo-mvc 示例应用程序中需要“应用”
Why is 'apply' necessary in this backbone todo-mvc sample application?
在 Backbone 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() );
},
与其他下划线方法(如 filter)相比,对 without 的调用看起来不合适。我仔细检查了 Backbone 源,以确保 without 没有以不同的方式混合到集合对象中。果然不是。
以下是下划线方法附加到集合的方式:
_.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());
这很好用。
我在这里忽略了什么?
我不认为你忽略了任何东西。这只是对apply
不必要的调用。可能作者最初写了以下内容(也许是为了早期版本的 Backbone)。
// Filter down the list to only todo items that are still not finished.
remaining: function() {
return _.without.apply( this, this.completed() );
},
Underscore 的without
将数组作为其第一个参数,并为以下参数从数组中排除值列表。在 Backbone 的情况下,底层方法正在处理的数组是集合 (collection.models
) 内的模型数组,要排除的值列表是已完成的待办事项。所以它本质上是
_.without.apply(collection.models, this.completed())
如果没有apply
则数组作为第二个参数传递给_.without
,这将尝试从数组中排除数组
_.without(collection.models, [completedTodo1, completedTodo2 /* , etc */]);
但是在apply
,完成的待办事项作为单独的参数传递,即:
_.without(collection.models, completedTodo1, completedTodo2 /* , etc. */)
这是您想要的,以便它将排除每个已完成的待办事项。
相关文章:
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- angular 1.5应用程序中的导航栏
- 在Web应用程序中使用Highcharts javascript
- angularjs+rails应用程序中未显示模板
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 科尔多瓦页面类应用程序中的多个谷歌地图
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- 在phonegap应用程序内部重定向不起作用
- 使用谷歌应用程序脚本从工作表中获取值并将其显示在文本框中
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- Node.js正在更改应用程序以使用集群模块
- 如何加载/构建 Chrome 应用/扩展程序并以编程方式运行
- Chrome 应用/扩展程序 - 后台请求错误,或允许应用问题加载 Google 文档 API
- 检测我使用的是 chrome 应用/扩展程序