2013-04-09 168 views
0

我有樹的JavaScript對象。我們稱之爲「家族」,它可以包含任意數量的可以包含任意數量的「子」對象的特定對象(「父母」)。此結構中的層級數是已知的,樹的每個級別只包含一個特定的類型。保存Javascript對象

所有的對象都具有數據和方法。

我想保存在databese的結構化數據。JSON.stringify()做它完美提取數據,並還節省的結構。但如何回到對象?JSON.parse()失敗,因爲它重新創建對象沒有方法。

我應該怎麼做在這種情況下?我應該寫我自己的函數重新創建從字符串的對象嗎?我應該將數據與方法一起保存(看起來很浪費)。

正如我所知道的結構,這將是非常方便的,如果將有可能指向一個對象,並說「這是一個父對象」,它會得到的方法。然後,我可以輕鬆地循環。但我不知道如何去做,而且我也擔心我的構造函數可能會將某些值設置爲默認值。

的對象構造函數可以是這個樣子:

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'的'狀態,方法是不沙爹 – 2013-04-09 14:04:16

+0

的一部分,如何你的方法添加? – 2013-04-09 14:04:17

+0

@ DanielA.White我將它們添加到對象構造函數中,如下所示:this.print = printLines;函數printLines(){...} – 2013-04-09 14:06:41

回答

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數據。

所有這一切說,你真的應該是簡單的存儲對象的狀態,並將其重新加載到應用程序中。

編輯:重建對象的客戶端

免責聲明:我不是一個PHP的人,所以你會留下來找到一個實際的編碼的例子,但我相信有一個在那裏與電源全能谷歌的。

你只需要使用您的串行化/解串類的數據序列化回你的對象。 所以,想象的僞代碼的部分是有問題的特定頁面的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()保存完全呢? – 2013-04-09 14:12:28

+0

@Juris將數據Json數據發送回服務器端。然後利用您擁有的任何DAL框架將其存儲在您的數據庫中。 – 2013-04-09 14:13:38

+0

@Juris Json.parse()僅解析出對象內的值,而不是函數。從字面上看,只是把它變成一個具有特定安排的字符串。您必須將此字符串返回到服務器並重建爲對象。你在使用什麼服務器端技術? – 2013-04-09 14:15:05