Tworzę stronę wyszukiwania ajax, która będzie składać się z pola wyszukiwania, szeregu list rozwijanych filtrów, a następnie UL, gdzie wyświetlane są wyniki.AngularJS - Używanie usługi jako modelu, ng-repeat nie aktualizowanie
Ponieważ część filtrów wyszukiwania będzie znajdować się w osobnym miejscu na stronie, pomyślałem, że dobrze byłoby utworzyć usługę, która zajmuje się koordynacją danych wejściowych i żądaniami ajaxów po stronie serwera wyszukiwania. Może to zostać wywołane przez kilka oddzielnych Kontrolerów (jeden dla pola wyszukiwania i wyników, a drugi dla filtrów).
Najważniejszą rzeczą, z którą walczę, jest uzyskanie wyników do odświeżenia, gdy wywoływany jest ajax. Jeśli umieściłem ajax bezpośrednio w kontrolerze SearchCtrl, działa dobrze, ale kiedy przeniesię ajax do usługi, przestaje on aktualizować wyniki, gdy wywoływana jest metoda wyszukiwania w usłudze.
Jestem pewien, że jest to coś prostego, za czym tęskniłem, ale nie mogę tego zobaczyć.
Markup:
<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();
}]);
Tutaj jest szorstka JSFiddle, mam wykomentowane Ajax, a ja po prostu aktualizowania zmienną wyników ręcznie jako przykład. Dla zwięzłości nie uwzględniłem menu rozwijanego filtru.
Jestem bardzo nowy angularjs, więc jeśli mam o nim w sumie przez niewłaściwy sposób, proszę mi powiedzieć, tak :)
Dzięki Mark. Była to część "kątowa.kopia", która była brakującym elementem układanki. –
To ma teraz dla mnie sens. Miałem to działające na 3 innych usługach/kontrolerach, ale były to tylko tablice, które naciskałem, aby wiązanie nigdy się nie zepsuło. Jeśli całkowicie wymieniasz tablicę/obiekt, musisz użyć kopii! Dzięki! – LukeP