我创建了一个ajax搜索页面,该页面将包含一个搜索输入框,一系列过滤器下拉菜单,然后是显示结果的UL。由于过滤器的搜索部分将位于页面上的一个独立位置,因此我认为创建一个处理协调输入和ajax请求到搜索服务器端的服务是一个不错的主意。然后可以由几个单独的控制器(一个用于搜索框和结果,另一个用于过滤器)调用。AngularJS - 使用服务作为模型,ng-repeat不更新
我正在努力挣扎的主要事情是调用ajax时刷新结果。如果我将ajax直接放在SearchCtrl控制器中,它可以正常工作,但是当我将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'部分,这是难题的一部分。 – 2013-03-12 09:40:38
这对我来说是完全意义上的。我曾在3个其他服务/控制器上工作,但他们只是我推动的阵列,所以绑定从未打破。如果您完全替换阵列/对象,则需要使用副本!谢谢! – LukeP 2014-10-13 22:19:11