2013-04-10 8 views
22

Mam następujących w moim pliku kontrolera:angularjs - TypeError: Object # <g> ma metoda 'push'

var Subject = $resource('/api/TestAccounts/:action', { applicationId: 3 }, { 
    'getSelect': { method: 'GET', params: { action: 'GetSelect' } } 
}); 

Subject.getSelect({ applicationId: 3 }, 
    function (resp) { 
     $scope.testAccounts = resp; 
     gridData = null; 
    } 
); 

Moje uruchamia kod serwera i powroty:

[{"id":5,"name":"xxx"},{"id":6,"name":"yyy"}] 

jednak Pojawia się następujący błąd:

TypeError: Object #<g> has no method 'push' 
    at copy (http://127.0.0.1:81/Scripts/angular.js:577:21) 

Czy ktoś ma pojęcie, co robię źle?

Odpowiedz

5

Właśnie zmieniłem MyService.get(...) na MyService.query(...), ponieważ .get() oczekuje, że obiekt i .query() oczekuje tablicy.

49

Musisz ustawić parametr paramater isArray na true w definicji zasobu, jeśli zwracasz tablicę z serwera.

var Subject = $resource('/api/TestAccounts/:action', { applicationId: 3 }, { 
    'getSelect': { method: 'GET', isArray: true, params: { action: 'GetSelect' } } 
}); 

Patrz: AngularJS $resource API

+3

to niezrozumiała wiadomość wyjątku, za pomyłkę, która może być wykonana tak łatwo. Mimo to jest to zdecydowanie odpowiedź. – chrismarx

+2

Tak, niektóre z komunikatów o błędach w Angular są nieco niejasne. Zrobili się lepsi, ale ten nadal stanowi poważny problem dla tych, którzy wciąż uczą się lin. –

+0

Miał ten sam problem i zmienił wyjście do JSON. Wydawało się, że jest lepszą opcją, jeśli masz ten luksus. – Jazzy

4

Znam ten post jest trochę przestarzały, ale znalazłem rozwiązanie, kiedy wpadłem na ten problem dzisiaj. Po wpisie poniżej wprowadziłem rozwiązanie joelwreed (w połowie wątku). Sprawdza, czy miejsce docelowe jest tablicą przed próbą pushowania, co rozwiązuje problem.

Link to issue filed on github

7

domyślnie GET oczekuje obiektu {}, zapytanie przewiduje szereg []. W twoim przypadku Web API zwraca tablicę dla GET, więc musisz ustawić flagę isArray dla GET jako true. Jeśli Twój Web API zwrócił obiekt, nie musiałbyś resetować tej flagi, ponieważ jest to domyślne zachowanie GET.

Powiązane problemy