検索入力ボックス、一連のフィルタドロップダウン、結果が表示されるULで構成されるajax検索ページを作成しています。AngularJS - サービスをモデルとして使用すると、ng-repeatが更新されない
検索のフィルタ部分がページ上の別の場所にあるため、入力とAjaxリクエストを検索サーバー側に調整するサービスを作成することをお勧めします。これは、2つの独立したコントローラ(searchboxと結果のためのものとフィルタのもの)から呼び出すことができます。
私が苦労している主なことは、ajaxが呼び出されたときに結果をリフレッシュすることです。 SearchCtrl Controllerに直接ajaxを置くと正常に動作しますが、ajaxをサービスに移動すると、サービスのfindメソッドが呼び出されたときに結果の更新が停止します。
私はそれが私が逃したシンプルなものだと確信していますが、私はそれを見ることができません。
マークアップ:
<div ng-app="jobs">
<div data-ng-controller="SearchCtrl">
<div class="search">
<h2>Search</h2>
<div class="box"><input type="text" id="search" maxlength="75" data-ng-model="search_term" data-ng-change="doSearch()" placeholder="Type to start your search..." /></div>
</div>
<div class="search-summary">
<p><span class="field">You searched for:</span> {{ search_term }}</p>
</div>
<div class="results">
<ul>
<li data-ng-repeat="item in searchService.results">
<h3>{{ item.title }}</h3>
</li>
</ul>
</div>
</div>
</div>
AngularJS:
var app = angular.module('jobs', []);
app.factory('searchService', function($http) {
var results = [];
function find(term) {
$http.get('/json/search').success(function(data) {
results = data.results;
});
}
//public API
return {
results: results,
find: find
};
});
app.controller("SearchCtrl", ['$scope', '$http', 'searchService', function($scope, $http, searchService) {
$scope.search_term = '';
$scope.searchService = searchService;
$scope.doSearch = function(){
$scope.searchService.find($scope.search_term);
};
$scope.searchService.find();
}]);
ここではラフJSFiddleで、私は、Ajaxをコメントアウトていると私は一例として、手動で結果変数を更新しています。簡潔さのために、私はフィルターのドロップダウンを含んでいません。
私はAngularJSに非常に新しいので、私は完全に間違った方法でそれについてつもりだ場合は、そう教えてください:)
ありがとうございました。それはパズルの欠けている部分だった 'angular.copy'部分でした。 –
これは今私には完全に意味をなさない。私は3つの他のサービス/コントローラで作業していましたが、バインディングが壊れることはありませんでした。アレイ/オブジェクトを完全に交換する場合は、コピーを使用する必要があります!ありがとう! – LukeP