jquery 1.6.2 / Firefox 6.0.1
好的我正在处理这个出货管理器界面,当页面加载时,每个表行tr都被分配了一个ID“shipment_XXXXX”,其中XXXXX是数据库中货件的ID。
有关货件的所有数据都是在PHP中设置为多维关联数组,其中包含“shipmentItems”和“pkgs”以及其他不相关的内容。 shipmentItems对象是一个常规数字数组,其中每个元素都有几个关联值,例如“name”,“qty”,“price”,例如:
$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数量,您将看到它累计该项目行的完整出货数量。
这组数据通过php转换为JSON字符串,并隐藏在其相应行中的隐藏表单元素中。
加载页面后,jquery遍历每个隐藏的json元素,将json字符串解析为一个对象,将对象附加到TR.data('shipmentItems')和TR.data('pkgs')列表中的货物。
这是事情变得时髦的地方......
我正在执行一项功能,用户可以在其中添加新包裹。当他们这样做时,系统会提示他们指定哪个包装包含整批货物中每件商品的数量。它们基本上布置了装箱单。
它们在绘制出数量后执行的函数,动态重新创建pkgs数组(对象),它从行.data('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,而且如果我从同一个对象日志中查看shipmentItems,所有shipmentItems的qty值也已重置为1 。这很奇怪,因为代码中的任何一点都没有覆盖shipItems,并且仍然应该与页面加载时完全相同...
任何人都有什么想法在这里发生?
答案 0 :(得分:1)
也许是因为您通过参考传递shipmentItems - curPS.push(shipmentItems [y]); 尝试通过Value传递它 - curPS.push(shipmentItems [y] .slice());
答案 1 :(得分:0)
好的,由于你的(Alon)建议指向了正确的方向,我最终得到了这个工作。 slice()方法不能完全正常工作,因为我正在切出的数组元素包含对象,因此更深的对象仍然作为引用传递而不是被复制。经过一番搜索,我发现jQuery.extend()方法是我需要复制对象数组的方法!再次感谢!