2013-04-09 3 views
0

У меня есть дерево объектов javascript. Назовем это «семьей», которая может содержать любое количество определенных объектов («родителей»), каждая из которых может содержать любое количество «дочерних» объектов. Количество уровней в этой структуре известно, и каждый уровень дерева содержит только объекты один определенный тип.Сохранение объекта Javascript

Все объекты имеют данные и методы.

Я хочу, чтобы сохранить структурированные данные в databese. JSON.stringify() делает его идеальным извлечения данных, а также сохранение структуры. Но как чтобы вернуться к объектам? JSON.parse() не работает, потому что он воссоздает объект без методов.

Что мне делать в этом случае? Должен ли я писать свою собственную функцию для воссоздания объекта из строки? ould Я как-то сохраняю данные вместе с методами (кажется, отходы).

Как я знаю, структура была бы очень удобной, если бы была возможность указать на объект и сказать «это родительский объект», и он получит методы. Тогда я мог бы легко пройти через него. Но я не знаю, как это сделать, и я также опасаюсь, что мои конструкторы могут установить некоторые значения по умолчанию.

Объектами Конструкторы будет выглядеть примерно так:

function lines() 
{ 
    this.lines = []; 
    this.height = 0.5*theMargin; 

    this.addLine = addLine; 

    function addLine(newline) 
    { 
     this.lines.push(newline); 
     this.height += newline.height; 
    } 
} 

function aLine() 
{ 
    this.dots = []; 
    this.height = 0; 
    this.length = indent; 

    this.insertDot = insertDot; 

    function insertDot(pos,newDot) 
    { 
     this.dots.splice(pos,0,newDot); 
     this.length += newDot.length; 
     this.height = Math.max(this.height,newDot.height); 
     if (this.length > maxLineLength) 
     { "I will not go into details here" } 
    } 
} 

Тогда я бы сделал так:

var a = new lines(); 
var testline = new aLine(); 
var testdot = new aDot(); 

testdot.height = 10; 
testdot.length = 15; 
testline.insertDot(0,testdot); 
a.addLine(testline); 
a.addLine(testline); 

Тогда я хочу, чтобы сохранить данные о длине и высоте. И структура, чтобы знать, какая точка принадлежит в какой строке.

Я отправляю эти данные на веб-сервер. Я думаю, что это ключевые линии, чтобы понять используемый подход:

post = "name=" + name + "&tab=" + JSON.stringify(file); 
req.open("POST", "saveFile.php", true); 
req.send(post); 

Сохраненный файл сохраняет именно то, что я хотел - структуру и данные. Но я не знаю, как заставить его снова стать объектом. Я не настаиваю на использовании метода JSON.stringify(). Мне понравился бы любой подход, который позволил бы мне сохранить содержимое без повторного сохранения методов.

+2

то, что вам нужно сохранить это состояние 'из object', методы не являются частью насытить –

+0

как добавляются ваши методы? –

+0

@ DanielA.White Я добавляю их в конструктор объектов с такими строками: this.print = printLines; function printLines() {...} –

ответ

1

В конце концов я выбрал простой способ воссоздать все объекты и скопировать данные. Это оказалось короче и приятнее, чем я себе представлял. В случае, если это полезно для тех, кто еще, вот как я это сделал:

data = JSON.parse(file); 
a = new lines(); 

a.height = data.height; 

for (var i=0; i<data.lines.length; i++) 
{ 
    a.lines.push(new aLine()); 
    a.lines[i].height = data.lines[i].height; 
    a.lines[i].length = data.lines[i].length; 
    for (var j=0; j<data.lines[i].dots.length; j++) 
    { 
     a.lines[i].dots.push(new aDot()); 
     [... and so on ...] 
    } 
} 
1

Если вы действительно подключены к идее сохранения целого объекта по какой-либо причине, то я предлагаю вам использовать метод toString(), который по существу возвращает тело кода функции в виде строки при вызове функция.

var obj = { func: function() { alert('hello!'); }; 
for(var key in obj) 
    if (typeof obj[key] === 'function') 
     alert(obj[key].toString()); 

Вам необходимо добавить код для сериализации и хранить эту информацию в дополнение к данным json.

Все, что вы сказали, вы действительно должны просто хранить состояние своих объектов и перезагружать их в свое приложение.

EDIT: Воссоздание объекта на стороне клиента

Отказ от ответственности: Я не PHP парень, так что вы будете оставаться в поиске пример на самом деле кодирования, но я уверен, что есть один там с силой всемогущего Google.

Вам просто нужно использовать класс сериализации/десериализации, чтобы сериализовать данные обратно в ваш объект. Итак, представьте, раздел псевдокода является файл PHP для конкретной страницы в вопросе:

<?php 
<html> 
     <head> 
      <script type="text/javascript"> 
       var model = /* Use serializing class on your server-side object */; 
       //Now you just need to build a function into your objects that is much like a constructor that can receive this model and rebuild the object 

       function rebuildObject(yourObject, jsonModel) { 
        //assign first property 
        //assign second etc... 
       } 
      </script> 
     </head> 
     <body> 
     </body> 
</html> 
?> 

Вы существенно шаблонировании данные JSon обратно на страницу в теге сценария, так что вы можете получить доступ к его стороне клиента. Javascript-интерпретатор автоматически преобразует json в фактический объект js, который может использовать ваш код, поэтому никаких проблем нет.

+0

Мне понравилось бы только сохранить состояние, но как я могу это сделать? Разве JSON.parse() не сохраняет именно это? –

+0

@Juris Json данные и отправить их обратно на сервер. Затем сохраните его в своей базе данных, используя всю имеющуюся у вас структуру DAL. –

+0

@Juris Json.parse() только разбирает значения внутри вашего объекта, а не функции. Это буквально просто превращает его в строку, которая имеет определенную компоновку. Вы должны вернуть эту строку на сервер и восстановить как объект. Какие серверные технологии вы используете? –

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