2013-03-12 46 views
0

我有一個骨幹應用程序,它從url中讀取svn文件路徑,然後「ls」是它給出的路徑。通常情況下,它只是列舉了表中ls的結果。但是我想要做的是檢查路徑是否實際上只對應一個特定的文件,在這種情況下,取而代之地顯示文件的內容。backbone.js根據ajax請求的結果採取不同的行動

這樣做會是一個很好的主幹慣用方式嗎?現在在我所稱爲目錄模型解析功能,我想這樣做是這樣的:

parse: function(response, options) { 
    if (response.length == 1 && response[0].type == "file") { 
     // what to do here? 
    } 
    this.get('entries').reset(response); 
    $("#indicator").hide(); 
    $('#directory-contents').show(); 
    this.trigger('change'); 
    return {}; 
    }, 

所以我很想只是一種讓一個Ajax請求獲取文件這裏的內容(即在// what to do here?),但a)直接做一個Ajax請求自己似乎不是很好,和b)我覺得我把兩個模型混合成一個。現在我的DirectoryView可能需要檢查某種標誌來判斷它是實際呈現一個目錄還是一個特定的文件。

有更好的方法來處理這個問題的任何想法?

回答

2

OK,審查意見,並瞭解您的域多一點之後,我會建議使用以下方法:

  • 創建一個代表一個文件系統節點的FSEntry模型(索引節點如果你願意)。關鍵的一點是可以代表一個目錄或文件
  • FSEntry應該有一個type字符串屬性,可以是「目錄」,「文件」,「符號鏈接」等
  • 基本fsEntry.fetch()應該只是加載元數據,包括type字段。
  • 渲染它的視圖可以響應模型事件進行渲染。根據模型實例的type,進行適當渲染(或者如果願意,可以在視圖正文中換入不同的模板)
  • 如果type是'文件',請讓視圖調用fsEntry.fetchContent()並響應對應的change:content事件來渲染文件內容
  • 稍後您可以向模型添加邏輯以緩存content數據,並且如果緩存中有新數據則不會重新提取它,但這是一種只有在所有功能都是正確。

基於您的代碼示例的備註:不要在模型或集合代碼中操作DOM!這是MV * facepalm失敗。

+0

我沒有計劃在模型中操作DOM,但如果我想要文件的實際內容,我將不得不做出單獨的ajax請求。有沒有更好的辦法可以做,而不僅僅是在上面的'parse'函數中有一個'$ .ajax(...)'? – Alec 2013-03-12 17:09:41

+1

那麼,你可以設置一個事件處理程序,以便在'change:type'事件處理時,如果文件內容尚未加載,那麼可以在該點處獲取它。你也可以創建一個獨立的'loadContent'方法來讓你的視圖可以調用。 – 2013-03-12 17:26:35

+1

我認爲這是你有一個FSEntry與2組數據:元數據和文件內容。遵循骨架模式,其中'fetch'獲取元數據,並製作另一個加載內容的'fetchContent'方法。一旦元數據到達,我不喜歡模型自動獲取內容的想法,儘管您可以這樣做。我寧願讓一個控制器或視圖告訴模型來獲取內容。 – 2013-03-12 17:29:56

相關問題