リソース呼び出しの動的 API を作成するには、最初に 2 つのエンドポイント、投稿、およびビデオにマップする 2 つの $resources を作成します。次に、ベース コントローラーの関数を呼び出すグローバル検索に ng-change イベントを配置します。
この関数はまず、検索する API を特定する必要があります。次に、適切な API 呼び出しを行います。重要な部分はコールバックにあり、これがあなたが探しているものだと思います。コールバックでは、API クエリから resp データを $broadcast できます。各コントローラーは、$on 関数を使用してイベントをリッスンします。リスナーは、正しいスコープ変数にコールバック データを入力します。
以下疑似。
ng-change と同じ HTML レイアウト
<html>
<body ng-controller="AppController">
<form>
<label>Search</label>
<input ng-model="global.search" ng-change="apiSearch()" type="text" class="form-control" />
</form>
<div ui-view="posts">
<div ng-controller="PostController">
<p ng-repeat="post in posts | filter: global.search">{{ post.name }}</p>
</div>
</div>
<div ui-view="videos">
<div ng-controller="VideoController">
<p ng-repeat="video in videos | filter: global.search">{{ video.name }}</p>
</div>
</div>
</body>
</html>
AppController
.controller('AppController', function ($scope, PostService, VideoService) {
$scope.apiSearch = function() {
// Determine what service to use. Could look at the current url. Could set value on scope
// every time a controller is hit to know what your current controller is. If you need
// help with this part let me know.
var service = VideoService, eventName = 'video';
if ($rootScope.currentController == 'PostController') {
service = PostService;
eventName = 'post';
}
// Make call to service, service is either PostService or VideoService, based on your logic above.
// This is pseudo, i dont know what your call needs to look like.
service.query({query: $scope.global.search}, function(resp) {
// this is the callback you need to $broadcast the data to the child controllers
$scope.$broadcast(eventName, resp);
});
}
})
結果を表示する各子コントローラー。
.controller('PostController', function($scope) {
// anytime an event is broadcasted with "post" as the key, $scope.posts will be populated with the
// callback response from your search api.
$scope.$on('post', function(event, data) {
$scope.posts = data;
});
})
.controller('VideoController', function($scope) {
$scope.$on('video', function(event, data) {
$scope.videos = data;
});
})