固定ヘッダーテーブルに関する問題で立ち往生しています。 AngularJS&Bootstrapを使用してWebアプリケーションを構築しています。IE7をサポートしていないため、ng-grid
を使用できません。したがって、テーブルの行に次のように入力しています。 ng-repeat
。アプリケーションは応答性です。したがって、セル/ヘッダーに固定幅を与えることはできません。簡単な方法はありますか?テーブルヘッダーは修正されていますか?
私はプランカーを AngularJSで修正されたヘッダーテーブル に配置しました
前もって感謝します。
最近、このディレクティブを作成しました。bowerを使用してインストールできます。
bower install angu-fixed-header-table
詳細と実際の例については、私のブログ投稿を参照してください http://pointblankdevelopment.com.au/blog/angularjs-fixed-header-scrollable-table-directive
Kumarの提案を使用して、2つのテーブルを作成しました。 1つにはtheadが含まれ、もう1つにはtheadとtbodyの両方が含まれます。
<div ng-style="{'margin-right': scrollBarWidth}">
<table>
<thead>
<tr>
<th width="{{tableSizes[0].width}}">Col0</th>
<th width="{{tableSizes[1].width}}">Col1</th>
<th width="{{tableSizes[2].width}}">Col2</th>
</tr>
</thead>
</table>
</div>
<div class="fixedHeadBody">
<table ng-style="{'margin-top': -rowSize.height}">
<thead>
<tr el-size="rowSize">
<th el-size="{{tableSizes[0].width}}">Col0</th>
<th el-size="{{tableSizes[1].width}}">Col1</th>
<th el-size="{{tableSizes[2].width}}">Col2</th>
</tr>
</thead>
<tbody>
<!-- data goes here -->
</tbody>
</table>
</div>
2番目のヘッダー内に、各列の幅と高さを監視するディレクティブ(以下を参照)を追加しました。これらの列の出力は、最初のシードの幅を設定するために使用されます(角度バインディング)。また、同じディレクティブを2番目のテーブルのヘッダーtrに追加し、height値を使用して2番目のテーブルのスクロール可能なヘッダーを非表示にしました。そうすれば、修正された最初のテーマのみを表示します。
もう1つ整理しなければならなかったのは、scrollBarでした。スクロールバーはスペースを取り、最初のテーブルと2番目のテーブルの間の列の位置がずれます。これを修正するために、スクロールバーの幅(テーブルを含むdivとテーブルの幅の差)に等しいマージン右を一番上のテーブルに追加しました。スクロールバーの幅はブラウザによって異なり、最後の機能はどのブラウザでも機能します。
app.directive('elSize', ['$parse', '$timeout', function ($parse, $timeout) {
return function(scope, elem, attrs) {
var fn = $parse(attrs.elSize);
scope.$watch(function () {
return { width: elem.innerWidth(), height: elem.innerHeight() };
},
function (size) {
fn.assign(scope, size);
}, true);
}
}])
コントローラ内で、以下の関数を使用してscrollBarWidthを設定できます。テーブルがレンダリングされたら、どこからでも$ scope.setScrollBarWidth()を呼び出すことができます。
$scope.scrollBarWidth = "5px";
$scope.setScrollBarWidth = function () {
$timeout(function () {
var divWidth = $(".fixedHeadBody").width();
var tableWidth = $(".fixedHeadBody table").width();
var diff = divWidth - tableWidth;
if (diff > 0) $scope.scrollBarWidth = diff + "px";
}, 300);
}
優れた ag-Grid ライブラリを使用できます。
agGrid.initialiseAgGridWithAngular1(angular); // https://www.ag-grid.com/best-angularjs-data-grid/index.php
angular.module('myApp', ['agGrid'])
次に、コントローラーで次のようなgridOptions
(または他の変数名)を定義します。
var nbCols = 10,
nbLines = 300,
list = [],
cols = [],
columnDefs = [],
i, j;
for (i = 0 ; i < nbCols ; i++) {
var fieldName = 'col' + i;
cols.Push(fieldName);
columnDefs.Push({
headerName: 'Col' + i,
field: fieldName,
editable: true
});
}
for (i = 0 ; i < nbLines ; i++) {
var elem = {};
for (j = 0 ; j < nbCols ; j++) {
elem[cols[j]] = 'content '+i+'-'+j;
}
list.Push(elem);
}
$scope.list = list;
$scope.cols = cols;
$scope.gridOptions = {
columnDefs: columnDefs,
rowData: list,
singleClickEdit: true
};
そして最後に、HTMLで次のようにテーブルを定義します。
<div ag-grid="gridOptions" class="ag-fresh" style="height: 300px;"></div>
同僚と私は、固定ヘッダーでテーブルを装飾するために使用できるAngularディレクティブを提供する新しいGitHubプロジェクトをリリースしました: https://github.com/objectcomputing/FixedHeader
この実装は、他のいくつかの実装ほど完全な機能を備えていませんが、固定テーブルを追加するだけでよい場合は、これが適切なオプションであると考えられます。
さて、$ watchとjQueryを使用してそれを汚い方法で行いました。
テーブルヘッダーを複製して、スティッキーにします。それは完璧ではありませんが、目的を果たします。
これがフィドルです: http://jsfiddle.net/jchnxu/w1n1fp97/7/
// watch the width of table headers
scope.$watch(function() {
return {
width: $(th).innerWidth(),
height: $(th).innerHeight()
};
}, function(size) {
console.log(size);
$($stickyThs[i]).attr('width', size.width);
}, true);
// also watch the table width
scope.$watch(function() {
return $bodyTable.innerWidth();
}, function(width) {
$headerTable.css('width', width + 'px');
});