2012-08-13 86 views
21

我正在嘗試使用Backbone和API。覆蓋主幹的解析函數

默認API響應格式爲:

{ 
somemetadatas:xxx , 
results:yyy 
} 

無論是單個模型或集合的抓取。

所以,據我知道,我可以覆蓋與骨幹parse功能:

parse: function (response) { 
    return response.results; 
}, 

但我已經看到了the documentation

解析collection.parse(response)

解析每當 ac時,主幹將調用 ollection的模型由服務器在獲取中返回。 函數傳遞了原始response對象,並應返回 模型屬性數組以添加到集合中。默認的 實現是無操作的,只需傳遞JSON響應即可。 如果您需要使用預先存在的API,或者更好地使用命名空間,則覆蓋此操作。請注意,之後,如果您的模型類 已具有parse函數,則將針對每個提取的 模型運行該函數。

所以,如果我有一個集合的響應取這樣的:

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

上收集的第一parse功能將提取[user1,user2]

但醫生說:

請注意,以後,如果你的模型類 已經有一個parse功能,它會針對每個運行進賬 模型。

所以它會嘗試找到response.results;user1user2

我需要在模型和收藏兩種解析功能,因爲這兩個模型和收集DATAS將結果屬性下。

但是,如果我抓取一個集合,我不希望模型解析函數再次用於單個數組元素。


那麼是否有解決這個問題的方法?

我想到了解決辦法在我的收藏解析功能將改變這樣的事情:

{ 
somemetadatas:xxx , 
results:[user1,user2] 
} 

弄成這個樣子:

[ {results.user1} , {results.user2} ] 

使模型解析功能不會在失敗收集提取。 但這有點不好意思...是否有任何優雅的解決方案來解決這個問題?


順便說一句,我的API總是會產生這種形式的結果,是有可能在默認情況下,以覆蓋所有我的模型和收藏parse功能? (對不起,我是一個JS noob ...)

回答

27

你可以測試你收到的數據是否被results成員封裝並作出相應的反應。例如,

var M = Backbone.Model.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

並有小提琴http://jsfiddle.net/9rCH3/

如果要概括這個問題,或者派生的所有模型類從這個基類或修改骨幹的原型來提供這樣的功能:

Backbone.Model.prototype.parse = function (data) { 
    if (_.isObject(data.results)) { 
     return data.results; 
    } else { 
     return data; 
    } 
}; 

http://jsfiddle.net/9rCH3/1/

+0

感謝會嘗試, – 2012-08-13 17:44:08

+0

我定製'parse'被調用,但沒有任何效果 - 在模型中值僅是在構造函數中提供一個初始...任何想法? – Dor 2014-02-06 16:34:39

+0

如果您正在嘗試對模型ID執行操作,則無法使用版本1.1.0。 http://backbonejs.org/#changelog如果不是這樣,你將不得不發佈一個問題。 – nikoshr 2014-02-06 16:40:10

1

解析也必須在Collecti中實現上。

var EgCollection = Backbone.Collection.extend({ 
    parse: function (data) { 
     if (_.isObject(data.results)) { 
      return data.results; 
     } else { 
      return data; 
     } 
    } 
}); 

http://backbonejs.org/#Collection-parse