2

私には解決できないように見える問題があります。データセットの配列をループし、データセットごとに独立したスリックグリッドを作成する関数を作成する必要があります。問題は、関数を各グリッドに個別にバインドする必要があることです。例えば:

// this part works fine
for(var i=0; i<domain.length; i++){
    dataView = new Slick.Data.DataView();
    grid = new Slick.Grid('#' + domain[i].name, dataView, domain[i].columns, domain[i].options);
    var data = domain[i].data;
    // this works well and I am able to create several slickgrid tables
    ... etc ...

問題は、すべてのグリッドが「グリッド」と呼ばれるようになったことです。したがって、次のような関数をバインドすると:

    // controls the higlighting of the active row
    grid.highlightActiveRow = function () {
        var currentCell;
        currentCell = this.getActiveCell();

すべてのグリッド (場合によっては 1 つのグリッドのみ) に影響する結果が得られます。

関連する機能を持つ複数の独立したグリッドを作成するにはどうすればよいですか??? 問題は、1 つのオブジェクト「グリッド」を作成し、構文 grid.xxx を使用してすべての関数を割り当てたことにあるようですが、反復ごとに一意のオブジェクトを作成する方法がわかりません。

どんな助けでも大歓迎です。

PS: slickgrid は素晴らしいです !!

ありがとう

// * ** * **更新* ** * ** * ** @Jokob、@user700284

ご協力ありがとうございました。これが私がたどり着いた場所です:

var dataView;
function buildTable() {

for(i = 0; i<domains.length; i++){
    dataView = new Slick.Data.DataView();
    var d = domains[i];
    grid = new Slick.Grid('#' + d.name, dataView, d.columns, grids.options);
    var data = d.data;
    grid.init();
    dataView.beginUpdate();
    dataView.setItems(data);
    // dataView.setFilter(filter); -- will be reinstated once i have this working
    dataView.endUpdate();
    arrOfGrids.push(grid);
    };
};

Jakob - 今のところ、私はあなたのコメントに頭を包むことができるまで "for(i)" に固執しています - これは非常に賢明なようです.

ただし、上記を使用すると、グリッド データは入力されません。js エラーは発生せず、列ヘッダーは表示されますが、データは表示されません。Chrome js デバッガーを使用してデータを表示できるため、d.data への参照は間違いなく正しいです。

何か案は?これまでお世話になりました

4

3 に答える 3

1

新しいグリッドをすべて割り当てる代わりにgrid(この場合、新しいグリッドを作成するたびに古いグリッドを上書きします)、それらを配列にプッシュします。

var arrayOfGrids = [];
for(var i=0; i<domain.length; i++) { 
    dataView = new Slick.Data.DataView();
    arrayOfGrids.push(new Slick.Grid('#' + domain[i].name, dataView, domain[i].columns, domain[i].options));
    // ....

次に、ハイライト関数を追加するなど、グリッドで何かをしたい場合は、配列をループして要素ごとに実行します。

for ( var i=0; i<arrayOfGrids.length; i++ ) {
    arrayOfGrids[i].highlightActiveRow = function () {
        var currentCell;
        currentCell = this.getActiveCell();
        // ... etc...

ボーナス

forEach作業中ですが、配列を反復処理するときは、for ループではなく、配列オブジェクトで使用できるメソッドを使用することをお勧めします。ループとは異なり、forEach変数の適切なスコープを作成し、無駄なi反復変数を取り除きます。

var arrayOfGrids = [];
domain.forEach(function(d) {
    dataView = new Slick.Data.DataView();
    arrayOfGrids.push(new Slick.Grid('#' + d.name, dataView, d.columns, d.options));
    // ....

そしてもちろん、他のループについても同じです:)

于 2013-07-12T08:14:10.383 に答える
1

他の誰かがこの質問に従っている場合に備えて、これが実際の解決策です。

@Jokob と @user700284 に感謝します。

// default filter function
function filter(item) {
    return true; // this is just a placeholder for now
}

var dataView;
function buildTables() {

    for(i = 0; i<domains.length; i++){
        dataView = new Slick.Data.DataView();
        var d = domains[i];
        grid = new Slick.Grid('#' + d.name, dataView, d.columns, options);
        var data = d.data;

        grid.init();
        dataView.beginUpdate();
        dataView.setItems(data);
        dataView.setFilter(filter);
        dataView.endUpdate();
        grid.invalidate();
        grid.render();

        arrOfGrids.push(grid);
    };
};
于 2013-07-12T15:48:44.830 に答える