3

関数内initialize()には jQueryeachループがあります。そのループ内には、 jQuery が現在のループ要素this.dbcolumnsに再割り当てされているため、明らかに機能していない参照があります。では、ループ内から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;
    }
} 
4

3 に答える 3

14

ループの外側で保持したい「this」への参照を作成します。

var self = this;

次に、ループ内で「self」を使用できます。

于 2012-06-17T10:02:45.637 に答える
4

thisコールバックの外部への参照を保存するeachか、ES5bindメソッドを使用します。

$(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));
于 2012-06-17T10:03:04.543 に答える
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;
}
于 2012-06-17T10:04:08.693 に答える