Backbone.js сериализация с корнями json

#json #persistence #backbone.js

#json #постоянство #backbone.js

Вопрос:

Я обнаружил, что backbone.js ожидает json в следующей форме:

{«id»:5, «title»:»Foo», «body»:»bar»}

Однако я нахожу разумным наличие корней json, особенно когда модели становятся вложенными и связанными с другими моделями. Как я могу убедить backbone.js чтобы понять json таким образом:

{«message»:{«id»:5,»title»:»Foo», «body»:»bar»}}

?

Комментарии:

1. вы хотите отобразить это в шаблоне?

2. Я вижу, что полное использование шаблонов может быть проблемой. Да, я хотел бы использовать это в шаблоне.

Ответ №1:

Этот вопрос может означать две вещи:

  • у вас есть JSON и вы хотите создать экземпляр новой модели
  • или у вас есть веб-сервис, который предоставляет вам следующую строку

Поскольку первое довольно тривиально, я полагаю, вы имеете в виду второй случай.

Если ваш веб-сервис выдает подобный JSON, вы можете перезаписать parse метод моделей и коллекций BackboneJS.

В принципе, вы можете воспользоваться реализацией Parse for models от Backbone и модифицировать ее в соответствии с вашими потребностями.

В вашем случае это должно сработать:

 parse : function(resp, xhr) {
  return resp.message;
},
  

Реализация для коллекций может выглядеть по-другому, я ее не пробовал.

Комментарии:

1. Изменяет ли это решение поведение, как Backbone.js оба анализируют ответ сервера и сериализуют модель? Спасибо за ответ.

2. Я так не думаю, но я не уверен на 100%.

Ответ №2:

Дайте мне знать, если это поможет. Вы можете увидеть это в действии здесь: http://jsfiddle.net/kahhor/haPFD /

 (function($){

    window.MyModel = Backbone.Model.extend({
    defaults:{"message":{"id":5,"title":"Foo","body":"bar"}}
});

window.MyView = Backbone.View.extend({

        render: function() {
            template= _.template($('#template').html());
            $(this.el).html(template(this.model.toJSON()));
            $('#container').html(this.el);
        }
});

})(jQuery);

$(document).ready(function() {
    var MyModel1 = new MyModel ();

    var MyView1 = new MyView ({model: MyModel1});
    MyView1.render();
});

<div id="container"></div>

<script type="text/template" id="template">
    <%= message.id %><br>
    <%= message.title %><br>
    <%= message.body %><br>

</script>