AngularJS - 将$ resource.query与params对象一起使用

sa1*_*125 28 query-parameters angularjs angular-resource

我正在努力寻找angular.js并找出一些记录较少的东西.

考虑一下 - 我在服务器上有一个搜索方法,它接受查询参数并返回搜索结果的集合,并响应 GET /search.json路由(Rails FWIW).

因此jQuery,示例查询将如下所示:

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

我正在尝试使用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: [ { ... }, { ... }, ... ]
    });
  }
}]);
Run Code Online (Sandbox Code Playgroud)

在视图中:

<body ng-app="searchApp">
  ...
  <div ng-controller="SearchController">
    ...
    <form ng-submit="search()">...</form>
    ...
   </div>
</body>
Run Code Online (Sandbox Code Playgroud)

但是,我一直得到像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){ ... });
Run Code Online (Sandbox Code Playgroud)

初始化$resource一次然后通过所请求的搜索中的更改传递不同的查询参数似乎更直观.我想知道我做错了(最有可能)或者只是误解了$resource.query使用查询params对象调用的文档,因为第一个参数是可行的.谢谢.

Upv*_*ote 24

TypeError:Object#没有方法'push',$ apply已在进行中

因为您尚未定义名为Search的资源.首先,您需要定义这样的资源.Doc:$资源.这是一个示例实现

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;
}]); 
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中包含此模块,并在此类控制器中使用它

$scope.search_results = MyResource.search({
   query: 'foobar'  
}, function(result){}); 
Run Code Online (Sandbox Code Playgroud)

但是我不确定这是否是你需要的.资源服务与RESTful服务器端数据源(即REST API)交互.

也许你需要一个简单的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.
  });
Run Code Online (Sandbox Code Playgroud)

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

  • Hm var Search = $ resource(...)实际上是正确的.但是资源需要返回一个对象,但是你返回一个数组?尝试在您的查询方法上设置isArray:true,类似问题https://groups.google.com/forum/#!topic/angular/MT1vIakNEVM (3认同)