Używam ostatnio dyrektywy ngTableDynamic
i działa doskonale, gdy dokładnie wiem, jakich kolumn powinna oczekiwać moja tabela. Występują jednak problemy, gdy moja tabela jest prawdziwie dynamiczna i nie wiem z góry liczby lub rodzaju kolumn, których można się spodziewać.Dodawanie kolumn do tabeli dynamicznej na podstawie wyników obietnicy
Na szczycie mojego kontrolera Oświadczam kolumny znam będzie obecna w każdej tabeli:
$scope.columns = [
{ title: 'ID', field: 'id', visible: true, required: true },
{ title: 'Email', field: 'email', visible: true, required: true }
];
I wtedy zrobić asynchronicznego połączenia z usługą, która zwraca wyniki. Na podstawie tych wyników wciskam jakiekolwiek dodatkowe obiekty kolumn do $scope.columns
:
var getResults = function() {
var defer = $q.defer();
reportService.getReportResults({
report: $scope.id,
version: $scope.version
}).$promise.then(function(data) {
$scope.data = data.results;
_.each($scope.data[0], function(value, key) {
if (key !== 'id' && key !== 'email') {
$scope.columns.push({
title: _str.capitalize(key),
field: key,
visible: true,
required: false
});
}
});
defer.resolve($scope.data);
});
return defer.promise;
};
Jednak kolumny popychany wewnątrz _.each
nie wprowadzać go do mojego stolika, kiedy go zobaczyć w przeglądarce. Jeśli mogę wymienić moje wezwanie asynchroniczny z twardego kodowane mock na przykładzie zestawu danych jednak, kolumny są dodawane i wszystko działa zgodnie z oczekiwaniami:
var getResults = function() {
var defer = $q.defer();
$scope.data = [{"id":"1","email":"[email protected]",,"create_date":"2013-09-03T09:00:00.000Z"},{"id":"2","email":"[email protected]","create_date":"2013-09-03T11:10:00.000Z"}];
_.each($scope.data[0], function(value, key) {
if (key !== 'id' && key !== 'email') {
$scope.columns.push({
title: _str.capitalize(key),
field: key,
visible: true,
required: false
});
}
});
defer.resolve($scope.data);
return defer.promise;
};
Dalej w moim kontroler mój kod startowych wzywa
getResults().then(function() {
$scope.tableParams.reload();
});
$scope.tableParams = new ngTableParams({...
Moje założenie jest takie, że jak tylko obietnica zostanie rozwiązana, $scope.tableParams.reload();
jest wywoływana przed zaktualizowaniem $scope.columns
.
co dzieje się z zakodowanego na stałe wersji modelowej jeśli przeniesiesz że 'getresults(). Następnie (...' wywołanie po utworzeniu '$ scope.tableParams'? – Will
Cześć, nie jestem zbyt biegły w Angular, ale czy mógłbyś mi powiedzieć, co to jest "$ Promise"? 'version: $ scope.version }). $ Promise' Nigdy wcześniej nie widziałem czegoś podobnego. –
@Mridul https://docs.angularjs.org/api/ngResource/service/$resource, znajdź $ promise –