web-dev-qa-db-fra.com

AngularJS - Utilisation de $ resource.query avec un objet params

J'essaye de ramasser angular.js et travailler à trouver certaines des choses qui sont un peu moins documentées.

Considérez ceci - J'ai une méthode de recherche sur le serveur qui accepte les paramètres de requête et renvoie une collection de résultats de recherche, et répond à GET /search.json route (Rails FWIW).

Donc avec jQuery, un exemple de requête ressemblerait à ceci:

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

J'essaie d'implémenter cela en utilisant angulaire, et j'envisage comment cela fonctionne. Voici ce que j'ai maintenant:

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: [ { ... }, { ... }, ... ]
    });
  }
}]);

Et dans la vue:

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

Cependant, je continue à recevoir des erreurs comme TypeError: Object #<Resource> has no method 'Push' et $apply already in progress.

Les choses semblent fonctionner comme prévu si je change le $resource initialisation comme suit:

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

Il semble plus intuitif d'initialiser le $resource une fois, puis passez différents paramètres de requête avec des modifications dans la recherche demandée. Je me demande si je me trompe (très probablement) ou si je comprends mal les documents qui appellent $resource.query avec l'objet de requête params comme premier argument possible. Merci.

28
sa125

TypeError: l'objet # n'a pas de méthode 'Push' et $ apply est déjà en cours

car vous n'avez pas défini de ressources avec le nom Rechercher . Vous devez d'abord définir une telle ressource. Doc: $ ressource . Voici un exemple d'implémentation

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;
}]); 

Incluez ce module dans votre application et utilisez-le dans un contrôleur comme celui-ci

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

Cependant, je ne sais pas si c'est ce dont vous avez besoin. Le service de ressources interagit avec les sources de données côté serveur RESTful aka REST.

Vous avez peut-être besoin d'un simple 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

24
Upvote