#javascript #json #backbone.js
#javascript #json #backbone.js
Вопрос:
Если я в формате JSON.string создам магистральную модель с вложенными коллекциями / моделями, отправлю ее через websockets другому магистральному клиенту и в режиме JSON.parse модель model = JSON.parse(model)
переменных будет работать так же, как и на другом клиенте?
Ответ №1:
Нет.
Возможно, я уточню. Когда я делаю это:
var o = JSON.parse(JSON.stringify(model));
В итоге я получаю простой объект o
. Почему? Ну, во-первых, JSON.parse()
ничего не знает о непримитивных типах (где Array и Object считаются примитивными) и, в частности, он не знает, что такое модель Backbone, поэтому он не может ее перестроить. Кроме того, JSON.stringify
вызовет toJSON
метод по его аргументу (если он, конечно, есть), и Backbone предоставит a toJSON
, который просто возвращает копию атрибутов модели в виде простого (возможно, вложенного) объекта. Итак, как только у вас есть выходные данные JSON.stringify(model)
, между строкой и моделью вообще нет связи, у вас просто есть простой старый сериализованный объект JavaScript.
Если вы хотите переместить магистральную модель из одной системы в другую, я думаю, вам придется самостоятельно отслеживать всю информацию о типе модели и объекте, а затем вручную перестраивать вашу сериализованную часть графа объектов с другой стороны.
Вероятно, вам было бы лучше сохранить модель обратно по ее URL-адресу, отправить идентификатор другому магистральному клиенту, а затем перезагрузить его с URL-адреса модели, как обычно. JSON предназначен для сериализации данных, а не объектов, интерпретация данных как объектов остается за приложением.
Комментарии:
1. Спасибо за отличный ответ. Я делаю это по всем веб-сайтам, поэтому, вероятно, я разработаю метод для восстановления состояния из примитивных данных.
2. @Lochlan: Вопрос касался копирования экземпляров модели из одного места в другое. В одном месте вам нужно было бы
JSON.stringify(model)
получить строку (в формате JSON), которую вы могли бы отправить в другое место. Затем, где-нибудь (или когда-нибудь), вы бы распаковали эту строку сJSON.parse
помощью .
Ответ №2:
Я знаю, что backbone поддерживает внутренний идентификатор для каждого из своих объектов, поэтому, если вы передаете их, как вы предложили, я не знаю, как это могло бы работать без возможности конфликта или дублирования идентификаторов cid.
С веб-сайта backbone:
Специальное свойство моделей, cid или идентификатор клиента — это уникальный идентификатор, автоматически присваиваемый всем моделям при их первом создании. Идентификаторы клиентов удобны, когда модель еще не сохранена на сервере и еще не имеет своего конечного истинного идентификатора, но уже должна быть видна в пользовательском интерфейсе. Идентификаторы клиентов принимают форму: c1, c2, c3 …
Редактировать:
Прочитав ответ «mu слишком короткий», я согласен с его ответом, но, чтобы добавить некоторые пояснения к его комментарию, который он оставил ниже, я нашел очень информативным. Потому что backbone.js модель имеет функцию toJSON(), когда вы вызываете JSON.stringify(model), она не анализирует все свойства, как вы ожидаете, она анализирует только объект, возвращаемый методом toJSON(). Отличный ответ для «mu слишком короткий».
Информация о MDN JSON.stringify(): https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/JSON/stringify
Комментарии:
1. Но
cid
в выходных данных не отображаетсяJSON.stringify()
, BackbonetoJSON()
возвращает только атрибуты модели. Итак, вам нужно будет выполнить всю сериализацию вручную, а затем отсортировать данные типа модели и идентификатора объекта на другой стороне, чтобы перестроить график. Попробуйте выполнить aconsole.log(JSON.parse(JSON.stringify(model)))
с одной из ваших базовых моделей, и вы увидите, что произойдет.2. @muistoosh отличный ответ и спасибо за информацию JSON.stringify().