开发者

JavaScript: Why isn't my closure working?

The following code is only assigning the value of the last .enter_form input to the last MYAPP.list[0].responses[MYAPP开发者_Python百科.score.round].form[key] (where key is the only thing that varies). I think it's because only the last value of the key is being passed to addEntry(), but I can't figure out how to get around that.

$('.enter_form input').each(function() {
    var key = $(this).attr('id');
    var val = $(this).val();
    userDict[key] = val;
    MYAPP.list[0].responses[MYAPP.score.round].form = [];
    function addEntry() {
        return function(k) {
            MYAPP.list[0].responses[MYAPP.score.round].form[k] =  {'entry': userDict[k]};
        }(key);
    }
    addEntry();
}


Your addEntry function is redundant since each iteration is already run inside it´s own scope so key and val are preserved properly (hope that explanation makes sense). Also the array you where inserting into was overwritten each iteration as well, so at the end of the .each() you end up with an array with only 1 value. It should also be an object rather then an array, even if the id's are numerical.

// you where overwriting this each iteration
MYAPP.list[0].responses[MYAPP.score.round].form = {};

$('.enter_form input').each(function() {

    var el= $(this); // cache instead of creating a new jQuery object each time
    var key = el.attr('id');
    var val = el.val();

    userDict[key] = val;
    MYAPP.list[0].responses[MYAPP.score.round].form[key] =  {'entry': userDict[key]};

}); // ); was also missing

Should work.


It's a bit hard to work out what it's meant to do, but I think this is probably it:

MYAPP.list[0].responses[MYAPP.score.round].form = [];
$('.enter_form input').each(function() {
    var $this = $(this),
        key = this.id,
        val = $this.val();
    userDict[key] = val;
    MYAPP.list[0].responses[MYAPP.score.round].form[key] = {
        'entry': val
    };
});

That's based on your saying that "...key is the only thing that varies" (presumably $(this).val() also varies, but I took your point). It will add entries to MYAPP.list[0].responses[MYAPP.score.round].form for each of the form's input ids, as well as adding them to the userDict map.

As a side note, if the id values on the input elements aren't purely numeric, then I suspect you want to start with a blank object:

MYAPP.list[0].responses[MYAPP.score.round].form = {};
//                                                ^^-- change is here

...rather than an empty array:

MYAPP.list[0].responses[MYAPP.score.round].form = [];

...although since arrays are objects, it works even if you're adding non-numeric properties.


Off-topic: No need for $(this).attr('id'). Just use this.id.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜