我正在尝试选择angular.js
并努力找出一些记录不足的事情。
考虑一下 - 我在服务器上有一个搜索方法,它接受查询参数并返回搜索结果的集合,并响应GET /search.json
路由(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
一次,然后通过所请求搜索中的更改传递不同的查询参数似乎更直观。我想知道我做错了(最有可能)或者只是误解了使用查询params对象调用$resource.query
的文档,因为第一个参数是可行的。谢谢。
答案 0 :(得分:24)
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服务器端数据源(即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.
});