2014-01-29 3 views
1

У меня есть файл JSON, который выглядит так.Магистраль и лучшая практика получения конфигурации JSON

{ 
    "config": { 
     "setting1": 'blabla', 
     "setting2": 'blablabla' 
    }, 
    "content": { 
     "title": "Title of an exercise.", 
     "author": "John Doe", 
     "describtion": "Exercise content." 
    }, 
    "answers": [ 
     { 
      "id": "1", 
      "content": "Dog", 
      "correct": true 
     }, 
     { 
      "id": "2", 
      "content": "Fish", 
      "correct": false 
     } 
    ] 
} 

Чем я создаю Backbone View, в сочетании с моделью содержимого, и ответы (которые случайным образом выбраны, но это не самый важный момент).

У меня также есть конфиг, в котором есть настройки, которые определяют, какие методы просмотра и коллекции использовать.

Это похоже на простую задачу, но поскольку я новичок в Backbone, мне интересно, какой из лучших способов получить JSON-файл, создав одну модель с url для 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 ».

IMHO, первое, что вам нужно сделать, это обработать отказ в обратном вызове getJson, чтобы сделать процесс более надежным.

Во-вторых, полезно создать Factory для генерации ваших представлений, потому что ваша логика состоит в том, чтобы генерировать разные представления на основе данных конфигурации с сервера. Таким образом, завод может быть:

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

Если логика проста, вы можете иметь Dict карту от конфигурации для просмотра класса, как:

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 
}; 

Кроме того, если у вас есть общие логики в вас «ContentView» с, это естественно, что вы можете иметь «BaseContentView» или «ContentViewMixin», чтобы извлечь общую логику и использование распространяется, чтобы сделать код более OO:

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

Так что, если кто-то пытается добавить новый ContentView, он/она просто нужно добавить код на заводе, чтобы сделать новый View генерироваться конфигурации. Затем расширяет ContentViewMixin для реализации нового представления.

+0

Спасибо, человек, все ваши предложения были очень полезны, и теперь я знаю, что я думаю правильно. Хорошего дня! – user1854236

Смежные вопросы