ho usato il suggerimento di Kumar e creato due tabelle. Uno contiene il thead e l'altro contiene sia il thead che il 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>
Nel thead della seconda, ho aggiunto una direttiva (vedi sotto) che guarda la larghezza e l'altezza di ogni colonna. L'output di queste colonne viene utilizzato per impostare la larghezza del primo thead (binding angolare). Ho anche aggiunto la stessa direttiva a thead tr del secondo tavolo e uso il valore di altezza per nascondere il punto scorrevole del secondo tavolo. In questo modo, mostro solo il primo thead che è stato risolto.
Un'altra cosa che dovevo risolvere era la barra di scorrimento. La barra di scorrimento occupa spazio e disallinea le colonne tra la prima e la seconda tabella. Per risolvere questo problema, ho aggiunto un margine destro alla tabella superiore uguale alla larghezza della barra di scorrimento (differenza di larghezza tra il div che contiene la tabella e la tabella). La larghezza della barra di scorrimento varia tra i browser e l'ultima funzione funziona per qualsiasi browser.
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);
}
}])
all'interno del controller, è possibile impostare la scrollBarWidth utilizzando la funzione qui sotto. Puoi chiamare $ scope.setScrollBarWidth() da qualsiasi posizione una volta che la tabella è stata renderizzata.
$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);
}
fonte
2015-03-06 22:14:17
I don Non capisco, vuoi che le intestazioni delle tabelle siano corrette ma anche reattive. Come è possibile? – Stewie
@Stewie per favore guarda questo: http://www.fixedheadertable.com/ –
@Stewie puoi anche fare l'esempio di ng-grid. Se si imposta l'intestazione fissa, rimane reattivo. –