web-dev-qa-db-ja.com

ng-gridの幅を自動調整する方法はありますか?

列の幅に問題があります。幅が事前にわからないことも、各列の幅を指定する必要もありません。コンテンツ(列ヘッダーを含む)に基づいてすべての列幅を自動調整する属性を使用できますか?

24
Riz

すごい!私はかなりクールな答えを思いつきました!幅を"auto"に設定することは、実際には機能していませんでした。 ng-viewを使用しているからでしょうか?わからない。そこで、controller.jsに追加できる2つの新しい関数を作成しました。このように使用すると、計算された列幅が得られます!コードのコメントを読んでください。いくつかの注意事項があります。

使用例、controllers.js:

var colDefs = makeColDefs(rows[0]);
colDefs = autoColWidth(colDefs, rows[0]);

$scope.phones = rows;
$scope.gridOptions = {
    data : 'phones',
    showFilter : true,
    enableColumnResize : true,
    columnDefs : colDefs
};

コード、controllers.js:

/**
 * Create a colDefs array for use with ng-grid "gridOptions". Pass in an object
 * which is a single row of your data!
 */
function makeColDefs(row) {
    var colDefs = [];
    for ( var colName in row) {
        colDefs.Push({
            'field' : colName
        });
    }
    return colDefs;
}

/**
 * Return a colDefs array for use with ng-grid "gridOptions". Work around for
 * "auto" width not working in ng-grid. colDefs array will have percentage
 * widths added. Pass in an object which is a single row of your data! This
 * function does not do typeface width! Use a fixed width font. Pass in an
 * existing colDefs array and widths will be added!
 */
function autoColWidth(colDefs, row) {
    var totalChars = 0;
    for ( var colName in row) {
        // Convert numbers to strings here so length will work.
        totalChars += (new String(row[colName])).length;
    }
    colDefs.forEach(function(colDef) {
        var numChars = (new String(row[colDef.field])).length;
        colDef.width = (numChars / totalChars * 100) + "%";
    });
    return colDefs;
}

ジャスミンテスト、controllerSpec.js:

'use strict';

var ROW = {
    'col1' : 'a',
    'col2' : 2,
    'col3' : 'cat'
};
var COLUMN_DEF = [ {
    field : 'col1'
}, {
    field : 'col2'
}, {
    field : 'col3'
} ];
var COLUMN_DEF2 = [ {
    field : 'col1',
    width : '20%'
}, {
    field : 'col2',
    width : '20%'
}, {
    field : 'col3',
    width : '60%'
} ];

/* jasmine specs for controllers go here */

describe('controllers', function() {
    beforeEach(module('myApp.controllers'));

    it('should make an ng-grid columnDef array from a row of data.',
            function() {
                expect(makeColDefs(ROW)).toEqual(COLUMN_DEF);
            });

    it('should return an ng-grid columnDef array with widths!', function() {
        var colDefs = makeColDefs(ROW);
        expect(autoColWidth(colDefs, ROW)).toEqual(COLUMN_DEF2);
    });

});
12
Jess

https://stackoverflow.com/a/32605748/1688306 の回答を参照してください

列名またはデータムのいずれか長い方で計算された列幅。

0
JamieS

Ui-gridを使用します。より適切である必要があります。 http://ui-grid.info/docs/#/tutorial/204_column_resizing

しかし https://github.com/angular-ui/ng-grid/wiki/Configuration-Options

0
Laura Riera

これは動作します:

$scope.gridOptions = {
                init: function (gridCtrl, gridScope) {
                    gridScope.$on('ngGridEventData', function () {
                        $timeout(function () {
                            angular.forEach(gridScope.columns, function (col) {
                                gridCtrl.resizeOnData(col);
                            });
                        });
                    });
                },
                data: 'scopeDataField',
                columnDefs: [
                    {
                        field: 'property1',
                        displayName: 'property1title',
                        width: '100px' // a random fixed size, doesn't work without this
                    },
                    {
                        field: 'property2',
                        displayName: 'property2title',
                        width: '100px'
                    }

                ],
                enableColumnResize : true
            };
0
Nina