現在、自分のサイトで同様のものを実行しています。ただし、それは独自のページであるため、検索をディレクティブにラップしませんでした。
セットアップ方法については、検索ページがありますsite.com/search
(たとえば、ランディング ページになります)。そのページには独自の controller/view がありますSearchController
。同じページには、基本的に配列内にあるアイテムをリストできる別のコンテナーがあります。最後に、ページ全体にApplicationController
.
現在、SearchController
とApplicationController
は明らかに分離しているため、互いのプロパティやメソッドにアクセスできません。ただし、彼らができることは、工場/サービスを共有するか、情報をブロードキャストすることです。この例を簡単にするために、 というサービスを共有しますSearchService
。
それでもディレクティブを使用したい場合は、簡単に をSearchController
ディレクティブに変更して、同じ概念を自分で利用できます。
基本的な Plunkr の例はこちら
検索サービス
にはSearchService
、検索に役立つプロパティとメソッドが含まれますが、今必要なのは、単純Array
に検索結果のリストを含めることだけです。
myApp.factory('SearchService', function() {
var SearchService;
SearchService = {};
// The array that will contain search results
SearchService.arrSearchResults = [];
return SearchService;
}
);
アプリケーションコントローラー
検索結果の実際の内容を使用して一覧表示できるようにApplicationController
、スコープには への参照があります。SearchService
ng-repeat
myApp.controller('ApplicationController', [
'$scope', 'SearchService', function($scope, SearchService) {
// Create a reference to the SearchService and add it to the
// $scope so it will be available on the page
$scope.searchService = SearchService;
}
]);
検索コントローラー
SearchController
スコープには への参照もあり、配列をSearchService
変更できるため、ページに表示される内容が変更されます。SearchService.arrSearchResults
また、フォームとやり取りするためのメソッドも含まれます。
検索が実行されると、URL の場所も変更されます。
myApp.controller('SearchController', ['$scope', 'SearchService', '$http', '$location', function($scope, SearchService, $http, $location) {
// Your search input
$scope.blab = "";
// Your search function
$scope.search = function() {
// Make sure blab has content (always good to double check)
if($scope.blab != "") {
// Alter URL to show new request
$location.search('q', $scope.blab);
// Make a GET request to your URL that will
// return data for you to populate
$http.get('/someUrl').
success(function(data, status, headers, config) {
// this callback will be called asynchronously
// when the response is available
alert("Search results found!");
// Assuming the data returned is a list of items
// or object items
// (i.e. [ "Search Result1", "Search Result2", ... ]
SearchService.arrSearchResults = data;
}).
error(function(data, status, headers, config) {
// called asynchronously if an error occurs
// or server returns response with an error status.
alert("Something failed! No results found!");
// Empty the array of search results
// to show no results
SearchService.arrSearchResults = [];
});
};
}]);
ページ
<!doctype html>
<head>
<title>Search Example Page</title>
<!-- Insert Angular.JS source files here -->
</head>
<body ng-controller="ApplicationController" ng-app="myApp">
<!-- ngView -->
<div role="main" data-ng-view>
</div>
<!-- Search Results -->
<div ng-repeat="searchItem in searchService.arrSearchResults">
<p style="border-bottom: 2px solid #000">Search Result: <br/>{{searchItem}}</p>
</div>
</body>
</html>
タブ
検索結果のタイプ (Web、画像など) を切り替えるためにSearchService
、検索の状態を制御する変数を 内に作成して、実行する検索のタイプを制御できます。
SearchService.typeOfSearch = "web";
これにより、状態が に設定さweb
れ、ページとアプリ内で対話できるようになります。
次にng-repeat
、ページ全体にさまざまな状態の結果を表示することができます。
<!-- Search Results - Web -->
<div ng-if="searchService.typeOfSearch='web'" ng-repeat="searchItem in searchService.arrSearchResults">
<p style="border-bottom: 2px solid blue">Search Result: <br/>{{searchItem}}</p>
</div>
<!-- Search Results - Image -->
<div ng-if="searchService.typeOfSearch='image'" ng-repeat="searchItem in searchService.arrSearchResults">
<p style="border-bottom: 2px solid red">Search Result: <br/>{{searchItem}}</p>
</div>
デモ用に Plunkr を更新しました。