2013-05-23 20 views
28

Próbuję odebrać angular.js i pracuję nad określeniem niektórych rzeczy, które są nieco mniej udokumentowane.

Rozważ to - Mam metodę wyszukiwania na serwerze, która akceptuje parametry zapytania i zwraca kolekcję wyników wyszukiwania i odpowiada na trasę GET /search.json (Rails FWIW).

Więc z jQuery, zapytanie próbka będzie wyglądać następująco:

$.getJSON('/search', { q: "javascript", limit: 10 }, function(resp) { 
    // resp is an array of objects: [ { ... }, { ... }, ... ] 
}); 

próbuję zaimplementować to korzystając kanciasty i owinąć głowę wokół, jak to działa. To jest to, co mam teraz:

var app = angular.module('searchApp', ['ngResource']); 

app.controller('SearchController', ['$scope', '$resource', function($scope, $resource){ 

    $scope.search = function() { 
    var Search = $resource('/search.json'); 
    Search.query({ q: "javascript", limit: 10 }, function(resp){ 
     // I expected resp be the same as before, i.e 
     // an array of Resource objects: [ { ... }, { ... }, ... ] 
    }); 
    } 
}]); 

I w widoku:

<body ng-app="searchApp"> 
    ... 
    <div ng-controller="SearchController"> 
    ... 
    <form ng-submit="search()">...</form> 
    ... 
    </div> 
</body> 

Jednak wciąż otrzymuję błędów takich jak TypeError: Object #<Resource> has no method 'push' i $apply already in progress.

rzeczy wydają się pracować zgodnie z oczekiwaniami, jeśli zmienię inicjalizacji $resource na następujące kwestie:

var Search = $resource("/search.json?" + $.param({ q: "javascript", limit: 10 })); 
Search.query(function(resp){ ... }); 

Wydaje się bardziej intuicyjne zainicjować $resource raz, a następnie przechodzą różne parametry zapytania ze zmianami w wymaganym wyszukiwania. Zastanawiam się, czy robię to źle (najprawdopodobniej) lub po prostu źle rozumiem dokumenty, które wywołujące $resource.query z obiektem params zapytania jako pierwszym argumentem jest wykonalne. dzięki.

Odpowiedz

24

TypeError: Object # has no method 'push' and $apply already in progress

ponieważ nie zdefiniowano zasoby z nazwą Search. Najpierw musisz zdefiniować taki zasób. Doc: $resource. Oto przykładową implementację

angular.module('MyService', ['ngResource']) 
     .factory('MyResource', ['$resource', function($resource){ 

    var MyResource = $resource('/api/:action/:query',{ 
     query:'@query' 
    }, { 
     search: { 
      method: 'GET', 
      params: { 
       action: "search", 
       query: '@query' 
      } 
     } 
    }); 
    return MyResource; 
}]); 

zawierać ten moduł w was app i użyć go w sterowniku jak ten

$scope.search_results = MyResource.search({ 
    query: 'foobar' 
}, function(result){}); 

Jednak nie jestem pewien, czy to jest to, czego potrzebujesz. Usługa zasobów współdziała z RESTful serwerowymi źródłami danych, podobnie jak REST API.

Może trzeba tylko prosty HTTP GET:

$http({method: 'GET', url: '/someUrl'}). 
    success(function(data, status, headers, config) { 
    // this callback will be called asynchronously 
    // when the response is available 
    }). 
    error(function(data, status, headers, config) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
    }); 

http://docs.angularjs.org/api/ng.$http

+0

Czy ustawienie 'var search = $ zasobu (...)' wcześniej nie rade? Przypuszczam, że wciąż pracuję nad koncepcją usług i fabryk w kanciastym. Również moja pierwsza próba dotyczyła '$ http' i działała dobrze. Chciałem też wypróbować '$ resource', aby uzyskać wyczucie używania. Dzięki! – sa125

+3

Hm var Search = $ resource (...) jest rzeczywiście poprawne. Jednak zasób oczekuje, że obiekt zostanie zwrócony, ale zwrócisz tablicę? spróbuj ustawić isArray: true w metodzie zapytania, podobny problem https://groups.google.com/forum/#!topic/angular/MT1vIakNEVM –

+1

Dlaczego przesuwasz parametr zapytania? – Vincent