2014-01-29 65 views
1

我有一個JSON文件,看起來像這樣。我從內容模型和答案(它們是隨機選擇的,但現在不是最重要的)創建了一個Backbone View,這個Backbone View是由內容模型和答案組合而成的。骨幹和最佳實踐獲取配置JSON

我也有一個配置,它的設置將決定使用哪個視圖和收集方法。

這似乎是一個簡單的任務,但由於我是Backbone的新手,我想知道哪個是獲取JSON文件的最佳方式,創建一個帶有JSON網址的模型,而不是使用解析和初始化創建另一個模型和集合(帶答案),或者使用$ .getJSON方法來創建我需要的模型。

使用$ .getJSON

$.getJSON(source, function(data) { 
    var contentModel = new ContentModel(data.content); 
    var contentView = new ExerciseView({ model: contentModel }); 

    var answerCollection = new AnswersCollection(); 
    _.each(data.answers, function(answer) { 
      answerCollection.add(answer); 
    }); 

    var answersView = new AnswersView({collection: answerCollection}); 

    $(destination).html(contentView.render().el); 
    $('.answers').append(answersView.el); 
)}; 

我嘗試,但它似乎很優雅的解決方案不,我知道,這個應用程序需要良好的架構,因爲它會基於「配置其他許多意見被開發」。

希望你們給我一些建議,祝你有美好的一天!

+0

我不認爲你在做什麼有什麼問題。你幾乎已經用更正式的MVC類型模式創建了一個小控制器。 –

回答

1

我認爲你所做的工作正常,並且是正確的。但是你可能需要重構一點點,因爲「它將根據'config''與許多其他視圖一起開發」。恕我直言,你需要做的第一件事就是在你的getJson回調中處理失敗,以使這個過程更健壯。

其次,創建Factory來生成視圖是很有用的,因爲您的邏輯是根據來自服務器的配置數據生成不同的視圖。所以工廠可能:

contentViewFactory.generate = function(data) { 
    var config = data.config; 
    .... 
    var ActualContentView = SomeContentView; 
    var contentModel = new ContentModel(data.content); 
    return = new ActualContentView({ model: contentModel }); 
} 

如果你的邏輯很簡單,你可以從配置一個字典地圖可以觀看像類:

var viewMaps = { 
    "exercise" : ExerciseView, 
    "other": SomeOtherView, 
    //.... 
} 

如果每個工作流有AnswersView你可以保持在你的getJSON回調。因此,也許現在你的getJSON看起來是這樣的:

$.getJSON(source, function(data) { 
    // keep the config->view logic in the factory 
    var contentView = contentViewFactory.generate(data); 

    var answerCollection = new AnswersCollection(); 
    _.each(data.answers, function(answer) { 
     answerCollection.add(answer); 
    }); 

    var answersView = new AnswersView({collection: answerCollection}); 

    $(destination).html(contentView.render().el); 
    $('.answers').append(answersView.el); 
}) 
.fail(){ 
    //some failure handling 
}; 

此外,如果你有你「的內容查看」的共同邏輯,這是自然的,你可以有一個「BaseContentView」或「ContentViewMixin」提取共同的邏輯和利用延伸到使你的代碼更OO:

Backbone.View.extend(_.extend({}, ContentViewMixin, { 
    //..... 
} 

所以,如果有人試圖添加新的內容查看,他/她只需要在出廠前添加一些代碼,使通過配置來產生新的看法。然後擴展ContentViewMixin以實現新的View。

+0

謝謝你,你的所有建議都非常有幫助,現在我知道我在想正確的方式:)。祝你有美好的一天! – user1854236