2011-09-03 91 views
1

的jQuery 1.6.2/6.0.1的Firefox奇怪的jQuery數據()問題 - 幫助?

OK我正在這批貨物管理器界面上,並加載頁面時,每個錶行TR被分配一個ID「shipment_XXXXX」其中XXXXX是的標識從數據庫裝運。

所有關於出貨的數據都是在PHP中設置爲多維關聯數組,其中包含「shipmentItems」和「pkgs」等無關的內容。所述shipmentItems對象是一個普通的數字陣列,其中每個元件具有幾個關聯值,例如「名稱」,「數量」,「價格」,所以例如:

$shipmentItems[0]["name"] = "item 1"; 
$shipmentItems[0]["qty"] = 5; 
$shipmentItems[0]["price"] = 20.00; 

$shipmentItems[1]["name"] = "item 2"; 
$shipmentItems[1]["qty"] = 3; 
$shipmentItems[1]["price"] = 5.00; 

此數組表示所有那些部分中的項目的整個這批貨物。

其他數組pkgs是貨件中每個包裹的列表,每個包裹都有一個packing_slip對象/關聯數組。示例:

PACKAGE #1 
$pkgs[0]['packing_slip'][0]['name'] = "item 1"; 
$pkgs[0]['packing_slip'][0]['qty'] = 3; 
$pkgs[0]['packing_slip'][0]['price'] = 20.00; 
$pkgs[0]['packing_slip'][1]['name'] = "item 2"; 
$pkgs[0]['packing_slip'][1]['qty'] = 1; 
$pkgs[0]['packing_slip'][1]['price'] = 50.00; 

PACKAGE #2 
$pkgs[1]['packing_slip'][0]['name'] = "item 1"; 
$pkgs[1]['packing_slip'][0]['qty'] = 2; 
$pkgs[1]['packing_slip'][0]['price'] = 20.00; 
$pkgs[1]['packing_slip'][1]['name'] = "item 2"; 
$pkgs[1]['packing_slip'][1]['qty'] = 2; 
$pkgs[1]['packing_slip'][1]['price'] = 50.00; 

您會看到pkg數組包含每個包裝的每個裝箱單的完整裝運料品清單。如果您從兩個包中添加0index qty,您會看到它加起來就是該項目行的完整出貨量。

這組數據被php轉換爲JSON字符串,並隱藏到其相應行中的隱藏表單元素中。加載頁面後,jquery會遍歷每個隱藏的json元素,將json字符串解析爲一個對象,將該對象附加到TR.data('shipmentItems')和TR.data('pkgs'),以便列表中的每件貨物。

這就是事情質樸...

我正在做一個功能,用戶可以在一個新的包添加到裝運。當他們這樣做時,會提示他們指定哪個包裝在整個裝運中有多少數量的每件物品。他們基本上佈置了裝箱單。

它們在映射出數量後執行的函數,從數據庫的行.data('pkgs')容器中重新獲得pkgs數組(對象),然後重新附加pkgs對象回到數據('pkgs')容器。

我已經記錄了此功能重的輸出和數量都被分配到正確的價值觀在這裏看到:

var shipmentItems = $('#shipment_'+shipid).data('shipmentItems'); 
var pkgs = $('#shipment_'+shipid).data('pkgs'); 
var pkgnum = pkgs.length; // always returns one higher than last index. 

// add new pkg to array 
pkgs[pkgnum] = new Object(); 
pkgs[pkgnum].weight = weight; 

console.log("("+pkgnum+") pkgs length: " + pkgs.length); 

// overwrite packing slip data. 
for(var x = 0; x < pkgs.length; x++) { 
    var curPS = new Array(); 
    var curins = 0; 
    for(var y = 0; y < shipmentItems.length; y++) { 
     var curqty = parseInt($('#pkgqty-'+y+'-'+x).val()); 
     curins += curqty * shipmentItems[y]['price']; 
     curPS.push(shipmentItems[y]); 
     console.log("["+y+"] before: " + curPS[y]['qty']); 
     curPS[y]['qty'] = curqty; 
     console.log("["+y+"] after: " + curPS[y]['qty']); 
    } 
    console.log(curPS[0]['qty'] + ' - ' + curPS[1]['qty']); 
    pkgs[x].packing_slip = curPS; 
    pkgs[x].insurance = curins; 
} 

// write pkgs data() 
$('#shipment_'+shipid).removeData('pkgs'); 
$('#shipment_'+shipid).data('pkgs', pkgs); 

上面的日誌輸出如下:

(1) pkgs length: 2 
[0] before: 3 
[0] after: 2 
[1] before: 4 
[1] after: 3 
2 - 3 // value of curPS[0]['qty'] and curPS[1]['qty'] for pkg#1 - pkgs[0] is set to curPS at this point. 
[0] before: 2 
[0] after: 1 
[1] before: 3 
[1] after: 1 
1 - 1 // value of curPS[0]['qty'] and curPS[1]['qty'] for pkg#2 - pkgs[1] is set to curPS at this point. 

這看起來像它的工作,對嗎?錯誤。函數完成後,我有一個按鈕,我可以按下它打印出一行所有的數據()變量。每個pkg ['packing_slip'] [x]項目的qty值不僅被設置爲1,而且如果我查看來自同一對象日誌的shipmentItem,則所有shipmentItems的qty值也被重置爲1 。這很奇怪,因爲在代碼中沒有任何點的貨物項會被覆蓋,並且應該和頁面加載時一模一樣......

任何人有任何想法這裏發生了什麼?

回答

1

也許這是因爲您通過參考 - curPS傳遞shipmentItem。推(shipmentItems [Y]); 嘗試通過Value - curPS.push(shipmentItems [y] .slice());

+0

哈哈我會嘗試,現在 - 謝謝 - 它絕對聽起來是正確的,因爲我習慣於PHP和我編碼的方式,將作爲在PHP中的「價值傳遞」。如果它有效,我會回覆 – SublymeRick

0

好的,我最終得到了這個工作,這要感謝你的(阿隆)建議,指出了我的正確方向。 slice()方法並不直接工作,因爲我正在切出的數組元素包含對象,所以深層對象仍然作爲引用傳遞而不是被複制。經過一番搜索後,我發現jQuery.extend()方法是我需要複製對象數組!再次感謝!