私は angular.js
を取り上げて、少し文書化されていないもののいくつかを解明しようとしています。
これを考慮してください-クエリパラメータを受け入れ、検索結果のコレクションを返し、GET /search.json
ルート(Rails FWIW)に応答する検索メソッドがサーバーにあります。
したがって、jQuery
を使用すると、サンプルクエリは次のようになります。
$.getJSON('/search', { q: "javascript", limit: 10 }, function(resp) {
// resp is an array of objects: [ { ... }, { ... }, ... ]
});
角度を使用してこれを実装しようとしていますが、それがどのように機能するかについて頭を包みます。これは私が今持っているものです:
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
を1回初期化してから、要求された検索の変更を含むさまざまなクエリパラメーターを渡す方がより直感的に思えます。私はそれを間違っているのか(おそらく)、最初の引数としてクエリパラメータオブジェクトを使用して$resource.query
を呼び出すことが可能なドキュメントを誤解しているのだろうかと思います。ありがとう。
TypeError:オブジェクト#にはメソッド 'Push'がなく、$ applyはすでに進行中です
名前Searchでリソースを定義していないためです。まず、そのようなリソースを定義する必要があります。 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.
});