2016-08-23 7 views
5

Występuje problem przy użyciu tabeli ng, w której parametry, które powinny zostać przekazane do funkcji getData, są niezdefiniowane. Jestem nowy w AngularJS i ng-table, więc każda pomoc będzie doceniona. Sprawdziłem, że wywołania REST w poniższym kodzie działają poprzez bezpośrednie wywoływanie ich, więc problem jest gdzieś w moim kanciastym kodzie/konfiguracji.Parametry niezdefiniowane w funkcji getData tabeli ng-tabeli

Tak czy inaczej, oto pseudo przykład mojego kontrolera. Rzeczywisty kod znajduje się w intranecie, więc nie mogę go bezpośrednio wkleić, więc wybacz wszystkie literówki z transkrypcji. Korzystanie ng-tabela 1.0.0 i 1.5.8 kątowa:

myApp.controller('myCtrl', ['$scope', '$http', 'NgTableParams', 
    function($scope, $http, NgTableParams) { 
    $http.get('services/data/count').success(function(data) { 
     // this works fine 
     $scope.totalRows = data.rowCount; 
    }); 
    $scope.tableParams = new NgTableParams({ 
     page: 1 
     count: 20 
    }, { 
     total: $scope.totalRows, 
     getData: function($defer, params) { 
      // this line fails with params being undefined 
      $http.get('/services/data/' + params.page() + '/' + params.count()) { 
      .success(function(data) { 
       $scope.data = data; 
       $defer.resolve(data); 
      }); 
     } 
    }); 
}]); 

I tu jest odpowiedni fragment kodu HTML:

<table ng-table="tableParams" class="table table-condensed table-striped"> 
    <tr ng-repeat="row in data"> 
     // row stuff here 
    </tr> 
</table> 

mam wstawiony console.log oświadczenia przed wywołaniem http getData, a parametry drukują jako nieokreślone.

+0

Podejrzewam jeśli '' console.log' swoją zmienną defer' $ zobaczysz obiekt, który oczekiwali, że "params" się utrzymają. –

+0

Ponadto, '$ http.success' jest [przestarzałe] (https://docs.angularjs.org/api/ng/service/$http#deprecation-notice). Zamiast tego użyj 'then (function (response), function (rejectionReason)). –

+0

Odliczanie $ ma wartości, których potrzebuję. Domyślam się, że pytanie od nowicjusza JS brzmi "dlaczego?" Ale mogę teraz iść do przodu. Wielkie dzięki. –

Odpowiedz

5

Niestety, nie zdawałem sobie sprawy, że mój komentarz może być mylący. Oto twoja odpowiedź:

Funkcja umieszczona w kluczu getData jest przyjęta (przez NgTable API), aby wziąć tylko jeden argument, który reprezentuje params. Innymi słowy, pierwszy argument funkcji getData zawsze zawiera wartości params, mimo że nazwa ta została nazwana $defer. Drugi argument jest zawsze niezdefiniowany (w końcu API nazywa go tylko jednym argumentem), mimo że nazwałeś go params.

Jeśli chcesz otrzymać dostęp do $defer (i wydaje się, że nie), myślę, że należy wprowadzić go do sterownika (dodać '$defer' do macierzy zależności na górze, a następnie dodać $defer na liście argumentów kontrolerze funkcja w tej samej pozycji)

to będzie wyglądać następująco:.

myApp.controller('myCtrl', ['$scope', '$http', '$defer', 'NgTableParams', 
    function($scope, $http, $defer, NgTableParams) { 
    $http.get('services/data/count').success(function(data) { 
     $scope.totalRows = data.rowCount; 
    }); 
    // ... 
    getData: function(params) { 
     $http.get('/services/data/' + params.page() + '/' + params.count()) { 
     .success(function(data) { 
      $scope.data = data; 
      $defer.resolve(data); 
     }); 
    } 
+1

było "$ odroczeniem" zawarte w starym tabeli? Zauważyłem też, że w starej wersji użyto małej litery 'n' dla' ngTableParams' w przeciwieństwie do prądu, który używa wielkich liter 'NgTableParams'. – dork

0

Zmienna $ defer (dzięki Jesse Amano!) Miała wartości, których potrzebuję. Nie wiem, dlaczego to działa, ale mogę go użyć.

5

ja też wpadłem na ten problem, kiedy mój nG-zaktualizowanej tabeli. Twój kod powinien działać w wersjach przed wersją 1.0.0. 1.0.0-beta.9 to ostatnia wersja obsługująca twój kod.

W 1.0.0 change notes mówi:

getData podpis zmiana

$ Defer paramater dostarczany do metody getData został usunięty. Zamiast tego twoja metoda getData powinna zwrócić tablicę lub obietnicę, która rozwiąże tablicę.

Aby przeprowadzić migrację

Poprzednio:

var tp = new NgTableParams({}, { getData: getData }); 

function getData($defer, params){ 
    // snip 
    $defer.resolve(yourDataArray); 
} 

Teraz:

var tp = new NgTableParams({}, { getData: getData }); 

function getData(params){ 
    // snip 
    return yourDataArrayOrPromise; 
} 
Powiązane problemy