I ont un uib-tabset
avec quatre onglets:UIB-onglet contenant UI-GRID
<uib-tabset active="activeForm">
<uib-tab index="0" heading="One"><ng-include src="'one.html'"></ng-include></uib-tab>
<uib-tab index="1" heading="Two"><ng-include src="'two.html'"></ng-include></uib-tab>
<uib-tab index="2" heading="Three"><ng-include src="'three.html'"></ng-include></uib-tab>
<uib-tab index="3" heading="Four"><ng-include src="'four.html'"></ng-include></uib-tab>
</uib-tabset>
il a ce contrôleur:
$scope.tabs = [
{ title: 'One', route: 'one' },
{ title: 'Two', route: 'two' },
{ title: 'Three', route: 'three' },
{ title: 'Four', route: 'four' }
];
$scope.go = function(route) {
$state.go(route);
};
Chaque patte a la même structure. Ils contiennent tous une interface utilisateur-GRID, et ne diffèrent que dans les données qu'ils contiennent:
$scope.dataList = [];
$scope.selectedFile = null;
$scope.gridOpts = {
enableFiltering: true,
enableRowSelection: true,
enableRowHeaderSelection: false,
multiSelect: false,
modifierKeysToMultiSelect: false,
noUnselect: false,
columnDefs: [..my fields..],
onRegisterApi: function(gridApi) {
//set gridApi on scope
$scope.gridApi = gridApi;
gridApi.selection.on.rowSelectionChanged($scope,function(row){
$scope.selectedFile = row.entity;
// Switcher selezione/deselezione
if ($scope.atLeastOneIsSelected === false){
$scope.atLeastOneIsSelected = true;
} else {
$scope.atLeastOneIsSelected = false;
}
});
gridApi.selection.on.rowSelectionChangedBatch($scope,function(rows){
$scope.atLeastOneIsSelected = false;
});
$scope.getFirstData();
}
};
$scope.addGridData = function(datalist) {
$scope.dataList = $scope.dataList.concat(datalist);
$scope.gridOpts.data = $scope.dataList;
};
$scope.getMoreDataAsync = function(firstData) {
if ($scope.cancelPromise) {
$scope.cancelPromise.resolve();
}
$scope.cancelPromise = $q.defer();
TypeOneFileSrv.fileList.get(
{
userId: $scope.$stateParams.userId
}, function(data) {
if (data) {
$scope.addGridData(data);
blockUI.stop();
}
}, function(error) {
if (error) {
toaster.pop('error', 'Error', error);
}
}
);
};
$scope.getFirstData = function() {
blockUI.start('Loading 'ONE' tab...');
$scope.selectedFile = null;
$scope.dataList.length = 0;
$scope.getMoreDataAsync(true);
};
Au moins, est ici le service qui appelle le serveur. Quant au contrôleur, même les services des quatre onglets sont les mêmes et ne diffèrent que dans l'url:
angular.module('app').factory('TypeOneFileSrv', ['$resource', function($resource) {
var typeOne = {
fileList: $resource('url_for_the_first_tab/:userId/?', {
userId: '@userId'
}, {
get: {
method: 'GET',
isArray: true
}
})
};
return typeOne;
}]);
Mon problème est que, même si j'ajouté le blockUI
dans chaque onglet, quand j'ouvre la page contenant le uib-tabset
il semble parfois qu'il ne charge pas toutes les données. Parce que par exemple je vois les deux premiers onglets qui ont la table remplie, mais les deux autres ne sont pas peuplés. Ou les deux premiers et le dernier, et ainsi de suite.
Cela semble fonctionner, mais comment avez-vous fait LOL pourquoi ça marche? Je ne peux pas comprendre, je pensais que c'était un problème asynchrone – panagulis72
Mon plaisir :) C'est un problème sur 'Ui-Grid'.Il a le nombre de solutions.Mais seulement ce qui précède a fonctionné pour moi.Voici le lien.https: //github.com/angular-ui/ui-grid/issues?utf8=%E2%9C%93&q=Grid+is+not+working+with+Tabs – Sampath