我有问题..当我提醒var / obj(字段)时,我没有得到正确的返回
尝试用封闭解决它,但仍然是相同的..
在click()之外,返回当前和右侧对象(字段),但不在
内this.insert_actions = function(row, id, table, elm, fields, options){
var actions = $('<div class="actions"></div>').appendTo(elm);
var _this = this;
if(options.edit){
alertobj(fields); // alerts object
var btn_send = $('<input class="btn btn_margin_top" type="button" value="'+Lang.get('BTN_SAVE')+'" />').appendTo(actions)
.click(function(){
alertobj(fields); // alerts object
});
....
this.insert_actions = function(row, id, table, elm, fields, options){
var actions = $('<div class="actions"></div>').appendTo(elm);
var _this = this;
if(options.edit){
alertobj(fields); // alerts object
var btn_send = null;
(function(fields){
btn_send = $('<input class="btn btn_margin_top" type="button" value="'+Lang.get('BTN_SAVE')+'" />').appendTo(actions)
.click(function(){
alertobj(fields); // alerts object
});
})(fields);
....
this.insert_actions = function(row, id, table, elm, fields, options){
var actions = $('<div class="actions"></div>').appendTo(elm);
if(options.edit){
alert(fields.account_id_.dom.val());
var btn_send = $('<input class="btn btn_margin_top" type="button" value="'+Lang.get('BTN_SAVE')+'" />').appendTo(actions)
.click(function(){
alert(fields.account_id_.dom.val());
_this.put_row({
id : id
}, {
index : row.index(),
insert : true
}, table, row, fields);
});
var btn_cancel = $('<input class="btn btn_light btn_margin_top" type="button" value="'+Lang.get('BTN_CANCEL')+'" />').appendTo(actions)
.click(function(){
_this.get_rows({
id : id
}, {
index : row.index()
}, table, row);
});
var Tab = new Tabindex();
for(var key in fields){
(function(key){
Tab.add(key, fields[key]);
fields[key].dom.keydown(function(e){
if(Detect_key.get_keyname(e) == 'ENTER'){
btn_send.click();
}
else if(Detect_key.get_keyname(e) == 'ESC'){
btn_cancel.click();
return false;
}
return Tab.press(key, e);
});
})(key);
}
}
else{
var btn_edit = $('<input class="btn" type="button" value="'+Lang.get('BTN_EDIT')+'" />').appendTo(actions)
.click(function(){
_this.get_rows({
id : id
}, {
index : row.index(),
edit : true
}, table, row, fields);
});
var btn_delete = $('<input class="btn btn_light" type="button" value="'+Lang.get('BTN_DELETE')+'" />').appendTo(actions)
.click(function(){
Dialog.set_dialog({
headline : Lang.get('HDL_DELETE'),
body : Lang.get('DLG_DELETE_ACCOUNT'),
btns : [
{
value : Lang.get('BTN_DELETE'),
func : function(){
var A = new Ajax();
A.url = 'json.action.php?action=delete_'+table;
A.data = {
id : id
};
A.success = function(response){
if(response.error){
var Cnt = new Content();
Dialog.set_error({
body : Cnt.error_body(response.error),
btns : [
{
value : Lang.get('BTN_OK'),
func : function(){
Dialog.rmv_error();
},
focus : true
}
]
});
}
else{
row.remove();
Dialog.rmv_dialog();
}
};
A.send();
},
focus : true
},
{
value : Lang.get('BTN_CANCEL'),
func : function(){
Dialog.rmv_dialog();
},
type : 'light'
}
]
});
});
actions.css({
opacity : 0
});
row.mouseover(function(){
actions.fadeTo(0, 1);
})
.mouseout(function(){
actions.fadeTo(0, 0);
});
}
};
答案 0 :(得分:0)
我可以看到的最可能的问题是这一行,来自append_rows
:
var curr_fields = fields;
似乎你期望这样做fields
的副本,但这不是实际发生的事情。 JavaScript对象实际上是“通过引用”传递的,因此当您将fields
的值分配给curr_fields
时,您将两个名称提供给一个对象
示例案例:
var a = { name: "foo" };
var b = a;
b.name = "bar";
alert(a.name); // Shows "bar"
闭包可能允许您在循环的另一次迭代中再次使用相同名称,但它永远不会为您提供同一对象的另一个副本。
Javascript不提供任何内置方式来执行“深层复制”,您需要获取多级嵌套fields
对象的完整副本。幸运的是,jQuery使用extend
方法,使用deep
参数。
这意味着你可以通过用以下代码替换行来获得所有工作:
var curr_fields = $.extend(true, {}, fields);
这样做是从一个新对象(中间参数中的{}
)开始,然后jQuery遍历fields
中的每个对象和属性并将其复制到新对象中,这是然后存储在curr_fields
。