Сохранение и восстановление объектов в Javascript? - PullRequest
0 голосов
/ 02 мая 2011

Я создаю базовый веб-инструмент для создания диаграмм, используя Javascript и библиотеку Raphael для создания фигур. Теперь я хотел бы узнать, как сохранить и восстановить созданные мной объекты.

Ниже код создает базовую фигуру и позволяет перетаскивать. Как бы я смог сохранить и восстановить такие объекты, как этот:

var cubeD = paper.rect(400, 400, 50, 50);
    cubeD.attr({"fill":"yellow"});
    cubeD.draggable.enable();
    cubeD.name = 'cubeD';
objArray.push(cubeD);
objArray_txt.push(cubeD.name);
objAssoc['cubeD'] = cubeD;

Я пытался сохранить объект в JSON, но следующий код, похоже, не работает:

var myJSON = JSON.encode(cubeD);

Но я получаю ошибку

TypeError: значение циклического объекта

Что бы посоветовали более опытные разработчики?

Ответы [ 4 ]

1 голос
/ 02 мая 2011

https://github.com/douglascrockford/JSON-js

Файл cycle.js допускает циклические ссылки.

Тогда вам просто нужно использовать эти функции, чтобы избежать ошибок, и просто использовать такназываемые «нормальными» методами JSON для сохранения и восстановления вашего объекта (спросите, не можете ли вы понять, как).При использовании «обычного» метода JSON для восстановления объекта не забудьте указать в качестве аргумента новый экземпляр конструктора вашего объекта, чтобы он содержал все необходимые вам методы и вел себя так, как вы ожидаете (поскольку JSON сохраняет только данные, не функции и, следовательно, он не может хранить конструктор).

0 голосов
/ 20 мая 2011

Попробуйте Рафаэль SketchPad

0 голосов
/ 02 мая 2011

Я использую эту библиотеку в большинстве моих проектов: https://github.com/douglascrockford/JSON-js

У нее есть метод $.toJSON, который сериализует / десериализует JavaScript в строку.Я не уверен, что это лучший подход, но он, безусловно, работает для нас.Я помещаю JSON в файл cookie и также читаю из него.

0 голосов
/ 02 мая 2011

Вы не можете рассчитывать на возможность сериализации объекта, созданного внешней структурой.Либо этот API поддерживает, либо нет (я не знаком с Рафаэлем).

Чтобы решить эту проблему, нужно иметь промежуточный формат, который, вероятно, является простым фрагментом JSON, и сериализовать его.Это содержит спецификацию для вашего объекта.Метод будет вызывать ваш API для создания объекта из вашего объекта JSON.Это будет вызвано после десериализации.

...