2017-01-20 10 views
1

この機能をオブジェクトWatcherTableにバインドすることはできますか?javascriptのプロトタイプバインディングを正しく定義する方法は?

WatcherTable.prototype.setRowData= function(function(rowData) {  
    var mockServer = new MockServer(); 
    mockServer.init(rowData); 

    var viewportDatasource = new ViewportDatasource(mockServer); 
    this.table.api.setViewportDatasource(viewportDatasource); 

    setTimeout(function() { 
    this.table.api.sizeColumnsToFit(); 
    }, 100); 
}).bind(this); 

をしかし、それは明らかに(私はこのコードは、それがどんな意味がないと思います)動作していない:バインディングが本当に

WatcherTable.prototype.setRowData= function(rowData) { 
    var mockServer = new MockServer(); 
    mockServer.init(rowData); 

    var viewportDatasource = new ViewportDatasource(mockServer); 
    this.table.api.setViewportDatasource(viewportDatasource); 

    setTimeout(function() { 
    this.table.api.sizeColumnsToFit(); 
    }, 100); 
}; 

をmindblowingすることができます私はすでにそのようにやってみました。

これを正しく行うにはどうすればよいですか?

setTimeout(function(){...})thisインサイド

+0

これは 'setTimeout'内の' this'にバインドしたい関数です。 – meehocz

+0

それも 'this.table.api.setViewportDatasource(viewportDatasource);' –

答えて

1

はもうWatcherTableインスタンスにリンクしていない、ありがとうございました。 Hereあなたは約thisの動作を読むことができます。

あなたはこの

WatcherTable.prototype.setRowData = function(rowData) { 

    var thisObj = this;//saving this 

    var mockServer = new MockServer(); 
    mockServer.init(rowData); 

    var viewportDatasource = new ViewportDatasource(mockServer); 
    this.table.api.setViewportDatasource(viewportDatasource); 

    setTimeout(function() { 
    thisObj.table.api.sizeColumnsToFit();//using thisObj 
    }, 100); 

}; 

ようprototype.setRowData()に予め保存することができそれとも、問題がsetRowData機能付きではありません。この

WatcherTable.prototype.setRowData = function(rowData) { 

    var mockServer = new MockServer(); 
    mockServer.init(rowData); 

    var viewportDatasource = new ViewportDatasource(mockServer); 
    this.table.api.setViewportDatasource(viewportDatasource); 

    setTimeout(() => {//arrow functions do not affect on 'this' 
    this.table.api.sizeColumnsToFit(); 
    }, 100); 

}; 
1

のようなのsetTimeout()内のES6arrow functionを使用することができますが、 setTimeoutのコールバックが機能します。

あなたはそれを修正するには、少なくとも3種類の方法があります。

使用.bind()

setTimeout(function() { 
    this.something(); 
}.bind(this), 100); 
現在のコンテキストを保存し

使用ES6の矢印機能:

setTimeout(() => { 
    this.something(); 
}, 100); 

ストア現在のコンテキストを変数:

var self = this; 
setTimeout(function() { 
    self.something(); 
}, 100); 
関連する問題