我有一个包含一些用户的集合。一些需要的信息是总共有多少页,多少页等等。我如何将这些信息传递给客户端?或者他们必须从单独的角度来看,在这种情况下,我需要多个Ajax调用?我想要收集fetch()
,并且还会收到一些“元数据”。处理这个问题的好方法是什么?backbone.js - 获取额外的数据以及请求
回答
一般情况下,你需要在集合类来处理这个解析方法。它的责任是获取响应并返回一组模型属性。但是,如果您希望如果您不介意解析方法承担额外责任,那么您可以做的不仅仅是这些。
UserList = Backbone.Collection.extend({
model: User,
url: '/users',
parse: function(data) {
if (!data) {
this.registered_users = 0;
return [];
}
this.registered_users = data.registered_users;
var users = _(data.users).map(
function(user_data) {
var user = {};
user['name'] = user_data.name;
return user;
}
);
return users;
}
});
因此在上面的简单的例子,假定服务器返回它包含注册用户和的计数和用户属性的阵列的响应。您既可以解析并返回用户属性,也可以选择已注册的用户数,并将其设置为模型中的变量。
解析方法会作为提取的一部分被调用。所以不需要修改抓取,只需使用您拥有的内置钩子方法即可。
纯粹主义者会说你给解析方法一个次要的责任,这可能会让一些人感到惊讶(例如返回一些东西并修改模型状态)。不过,我认为这没关系。
执行此操作的一种方法是覆盖Collection::fetch()
方法,以便它将此元数据解析出响应。你可以有你的后端返回这样的回应:
{
"collection": [
{ ... model 1 ... },
{ ... model 2 ... },
...
],
"total_rows": 98765,
"pages": 43
}
在你fetch
方法,它会覆盖原有的Backbone.Collection::fetch()
方法,可以分别处理对象的每个属性。这里是你可以做的超越与稍微修改fetch
方法:
_.extend(Backbone.Collection.prototype, {
fetch : function(options) {
options || (options = {});
var collection = this;
var success = options.success;
options.success = function(resp) {
// Capture metadata
if (resp.total_rows) collection.total_rows = resp.total_rows;
if (resp.pages) collection.pages = resp.pages;
// Capture actual model data
collection[options.add ? 'add' : 'refresh'](
collection.parse(resp.collection), options);
// Call success callback if necessary
if (success) success(collection, resp);
};
options.error = wrapError(options.error, collection, options);
(this.sync || Backbone.sync).call(this, 'read', this, options);
return this;
});
注意,这种方法使用_.extend
会影响所有你的类延伸Backbone.Collection
。
这样,您不必对后端进行2个独立的调用。
我不认为重写框架方法是解决此问题的正确方法。相反,你希望生活在钩子方法中来完成所要求的东西。解析似乎是这种事情的一个合适的地方。 覆盖框架方法留下了一个危险,即当您想升级backbone.js时,事情可能无法按预期工作,或者您可能无法利用已分配给该方法的任何新功能。 – 2011-04-30 17:43:03
你是对的,一般你不想影响从框架原型继承的所有方法。出于某种原因,我认为OP希望在所有Collection类中使用此功能,并且重写框架方法是一种便捷的方法。无论如何,'parse'方法似乎是一个更好的地方。 – Sam 2011-05-02 20:44:36
我会在pagecreation引导信息。当服务器创建站点时,将信息写入html文档。就像那样,你根本不需要进行ajax调用。我用ordner中的整个集合来做这件事,不要先加载页面,然后等待ajax调用返回所需的信息。
代码示例使用Python:
64号线:https://github.com/ichbinadrian/maps/blob/master/python/main.py < - 从这里
第43行:https://github.com/ichbinadrian/maps/blob/master/templates/index.html < - 到这里
- 1. 从服务器获取额外的数据以及POST请求
- 2. AngularJS ngRoute - 从模板请求获取额外的数据
- 3. 发送请求当我转换数据获取额外支架
- 4. 使用backbone.js在保存请求中发送额外的非模型数据?
- 5. SQL获取额外行的数据
- 6. 从获取请求中获取数据?
- 7. 从获取请求获取div数据
- 8. 获取http请求的内容以及单个请求中的响应url
- 9. 使用CallResponder时传递额外参数以请求的ActionScript
- 10. 初始backbone.js数据获取
- 11. Http获取请求中止以前的获取请求
- 12. 如何在请求中发送额外的数据?
- 13. 如何使用以下方法获取许多额外数据?
- 14. 请求中额外的SOAP信息
- 15. 跳过ActiveRecord提出的额外请求
- 16. AJAX请求获取ID以及将其放入HTML
- 17. 从Python中获取请求中的数据提取数据
- 18. PHP从DELETE请求中获取数据
- 19. 从请求获取路由数据
- 20. 从请求获取发布数据
- 21. 核心数据获取请求关系
- 22. 从ajax请求获取json数据
- 23. 优化核心数据获取请求
- 24. fcbkcomplete与ajax请求获取数据
- 25. 从XHR请求获取BLOB数据
- 26. 从POST请求中获取数据
- 27. 核心数据获取请求优化
- 28. Swift - 从Alamofire POST请求获取数据
- 29. 从请求中获取POST数据
- 30. 以Django的形式获取请求数据
您能否提供更多信息?你的服务器是什么样的?你需要支持哪些浏览器?你多久收一次数据? – tjameson 2011-04-19 03:26:04
@tjameson我的服务器只是使用php的nginx。我不需要支持任何特定的浏览器(如果需要,我可以支持Chrome和Firefox)。我经常收到我的数据(这只是crud操作),所以更改页码或做一个快速搜索等。 – Matthew 2011-04-27 12:07:38