我有一個包含一些用戶的集合。一些需要的信息是總共有多少頁,多少頁等等。我如何將這些信息傳遞給客戶端?或者他們必須從單獨的角度來看,在這種情況下,我需要多個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. Backbone.js在POST請求中獲取數據
- 3. AngularJS ngRoute - 從模板請求獲取額外的數據
- 4. 發送請求當我轉換數據獲取額外支架
- 5. 使用backbone.js在保存請求中發送額外的非模型數據?
- 6. OAuth2Client獲取額外的Facebook數據
- 7. SQL獲取額外行的數據
- 8. Backbone.js的集合讀取請求丟失的數據參數,IE9
- 9. 從獲取請求中獲取數據?
- 10. 從獲取請求獲取div數據
- 11. 獲取http請求的內容以及單個請求中的響應url
- 12. 使用CallResponder時傳遞額外參數以請求的ActionScript
- 13. Http獲取請求中止以前的獲取請求
- 14. 如果VCR捕獲JavaScript請求以及?
- 15. 設置在post請求javascript和jquery,數據和額外參數
- 16. 初始backbone.js數據獲取
- 17. 如何在請求中發送額外的數據?
- 18. 獲取請求對象和額外的參數到自定義裝飾器
- 19. 如何將額外數據傳遞給片段類以及如何獲取片段中的數據?
- 20. 如何使用以下方法獲取許多額外數據?
- 21. 請求中額外的SOAP信息
- 22. Uploadify初始化的額外請求
- 23. 跳過ActiveRecord提出的額外請求
- 24. 使用請求上傳文件併發送額外數據
- 25. AJAX請求獲取ID以及將其放入HTML
- 26. 獲取請求的數量
- 27. AJAX請求 - 添加額外的GET請求內部循環
- 28. jQuery ajax請求之後對圖片的額外請求
- 29. 從Python中獲取請求中的數據提取數據
- 30. 以下JSON請求數據無效,以及如何使其成爲有效的JSON數據請求?
您能否提供更多信息?你的服務器是什麼樣的?你需要支持哪些瀏覽器?你多久收一次數據? – tjameson 2011-04-19 03:26:04
@tjameson我的服務器只是使用php的nginx。我不需要支持任何特定的瀏覽器(如果需要,我可以支持Chrome和Firefox)。我經常收到我的數據(這只是crud操作),所以更改頁碼或做一個快速搜索等。 – Matthew 2011-04-27 12:07:38