关闭 - 但仍然不是当前的变量

时间:2011-06-20 09:59:43

标签: javascript jquery

我有问题..当我提醒var / obj(字段)时,我没有得到正确的返回

尝试用封闭解决它,但仍然是相同的..

在click()之外,返回当前和右侧对象(字段),但不在


编辑:jsfiddle

http://jsfiddle.net/CfxLx/

现在已经制作了一个jsfiddle ...当你想编辑一行然后想要保存它时,警告框会从你上次按下的行中返回id


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);
        });
    }
};

1 个答案:

答案 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