在每个循环中jQuery这个

时间:2012-06-17 09:59:58

标签: jquery

initialize()函数内部有一个jQuery each循环。在该循环内部是对this.dbcolumns的引用,这显然不起作用,因为jQuery已将this重新分配给当前循环元素。那么如何从循环内引用this.dbcolumns?它在循环外工作正常。

function datatable() {
    this.url = '';
    this.htmltable = '';
    this.dbtable = '';
    this.dbcolumns = new Array();
    this.idfield = 'id';
    this.pageno = 0;
    this.pagesize = 15;
    this.totalpages = 0;
    this.totalrecords = 0;
    this.searchterm = '';

    this.initialize = function() {
        this.dbtable = $(this.htmltable).attr('data-table');
        this.dbcolumns.push(this.idfield);
        $(this.htmltable + ' th[data-field]').each(function(i, col){
            this.dbcolumns.push( $(col).attr('data-field') ); /* <<<<<<<<<< this line */
        });
        return this;
    }
} 

3 个答案:

答案 0 :(得分:14)

引用你想要保持在循环之外的“this”。

var self = this;

然后你可以在循环中使用“self”。

答案 1 :(得分:4)

this回调之外存储对each的引用,或使用ES5 bind method

$(this.htmltable + ' th[data-field]').each(function(i, col){
     this.dbcolumns.push( $(col).attr('data-field') );
}.bind(this));

或者,如评论中所述,使用$.proxy

$(this.htmltable + ' th[data-field]').each($.proxy(function(i, col){
     this.dbcolumns.push( $(col).attr('data-field') );
}, this));

答案 2 :(得分:3)

要解决的常见JS模式是使用闭包:

this.initialize = function() {
    var that = this;

    this.dbtable = $(this.htmltable).attr('data-table');
    this.dbcolumns.push(this.idfield);
    $(this.htmltable + ' th[data-field]').each(function(i, col){
        that.dbcolumns.push( $(col).attr('data-field') ); /* <<<<<<<<<< this line */
    });
    return this;
}