2013-07-26 67 views
1

雖然使用主幹來打api,但我發現我只需要在響應中包含一些數據。除了關於我不需要的對象的數據之外,網絡服務器還提供了元數據。如何在backbone.js中進行自定義模型數據解析?

以下解決方案有效,但感覺不對。有沒有這樣做的標準方式?

var accountsCollection = new AccountsCollection(); 

accountsCollection.fetch({success : function(collection){ 
    var results = new AccountsCollection(); 
    collection.each(function(item){ 
     results.add(new AccountModel({ 
      id: item.toJSON().result[0].id, 
      messageText: item.toJSON().messageText, 
      address1: item.toJSON().result[0].address1, 
      address2: item.toJSON().result[0].address2 
     })); 
    }); 

    onDataHandler(results); 
}}); 

編輯:這是我基於公認的答案最終解決方案:

parse: function(response) { 
     var accounts = []; 
     _.each(response['result'], function (account) { 
      accounts.push(account); 
     }); 
     return accounts; 
    } 
+0

爲什麼不乾脆忽略不需要的數據?更清潔,並且不像您使用上述方式節省任何處理。 – MBHNYC

+0

@MBHNYC它不是更清潔,因爲當我打電話保存它會試圖堅持這些東西,而且我必須在我的模板中的每個字段之前寫入.result [0],並嘗試使用我的模型。它混淆了整個應用程序。 – samspot

回答

4

你可以嘗試重寫Backbone.Collection.parse方法,並做一些瘋狂的東西下劃線。沒有它是否適合你的數據想法..

var keysILike = ['foo', 'bar']; 

AccountsCollection.extend({ 
    parse: function(response) { 
    return _.compact(_.flatten(_.map(response, function (model) { 
     var tmp = {}; 
     _.each(_.keys(model), function (key) { 
     if (_.contains(keysILike, key)) tmp[key] = model[key]; 
     }) 
     return tmp; 
    }))); 
    } 
}); 

對於@舒尚特的迷死你一定要使用此解決方案:

var keysILike = ['foo', 'bar']; 

AccountsCollection.extend({ 
    parse: function(response) { 
    _.each(response, function (model) { 
     _.each(_.keys(model), function (key) { 
     if (!_.contains(keysILike, key)) delete model[key] 
     }) 
    }); 
    return response; 
    } 
}); 
+1

+1 ..這是一個更好的主意,比OP的嘗試..哈希方法..也可以避免一個額外的對象來存儲所有的鏈接鍵..相反,只是從響應對象刪除數據..'if(!_ .contains(keysILike,key))刪除響應[key];'而且只是回覆回覆 –

+0

啊這更簡單了,謝謝! – cr0

+0

@ cr0 ..不客氣。但是這是對已經編寫的代碼的補充;) –

相關問題