Подтвердить что ты не робот

AngularJS - Использование ресурса $resource.query с объектом params

Я пытаюсь подобрать angular.js и работать над выяснением некоторых вещей, которые немного менее документированы.

Рассмотрим это. У меня есть метод поиска на сервере, который принимает параметры запроса и возвращает коллекцию результатов поиска, и отвечает на GET /search.json route (Rails FWIW).

Итак, с jQuery пример запроса будет выглядеть так:

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

Я пытаюсь реализовать это с помощью angular и обернуть вокруг себя то, как он работает. Это то, что у меня есть сейчас:

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

И в представлении:

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

Однако я продолжаю получать ошибки, такие как TypeError: Object #<Resource> has no method 'push' и $apply already in progress.

Похоже, что все будет выглядеть так, как если бы я изменил инициализацию $resource на следующее:

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

Кажется более интуитивно понятным инициализировать $resource один раз, а затем передать различные параметры запроса с изменениями в запрошенном поиске. Интересно, если я делаю это неправильно (скорее всего) или просто неправильно понял документы, вызывающие $resource.query с объектом params запроса, поскольку первый аргумент возможен. Благодарю.

4b9b3361

Ответ 1

TypeError: объект # не имеет метода push и $apply уже в процессе

потому что вы не определили ресурсы с именем Поиск. Сначала вам нужно определить такой ресурс. Doc: $resource. Ниже приведен пример реализации

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

Включите этот модуль в свое приложение и используйте его в таком контроллере

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

Однако я не уверен, что это то, что вам нужно. Служба ресурсов взаимодействует с источниками данных сервера RESTful, а также API REST.

Возможно, вам нужен только простой 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