我喜欢在角度js中对http资源进行搜索。只要我从结果页面以外的任何其他页面搜索,Evertything就可以了。如果我再次搜索结果页面,我会得到结果对象,但范围不会更新。您可以在此处找到此行为的示例: Example page。
重现的步骤:
以下是我实现该功能的方法:
angular.module('gp3').controller('SearchController',function($scope,$location,SearchService,$http) {
$scope.keyword="";
$scope.options={};
$scope.results = SearchService.getResults();
$scope.search = function() {
SearchService.search($scope.keyword,$scope.options).then(function(data) {
$scope.results = data;
console.log(data);
$location.path('/search');
},function(reason) {
$scope.results = [];
$location.path('/search');
});
};})
.factory('SearchService',function($http,$q) {
var SearchService = {};
var results = [];
SearchService.getResults = function() {
return SearchService.results;
};
SearchService.search = function(keyword,options,callback) {
var def = $q.defer();
$http.get("/api/search/" + keyword,options)
.success(function(data,status,headers,response){
SearchService.results = data;
def.resolve(data);
})
.error(function(status,headers,response){
def.reject("Failed to search");
})
return def.promise;
};
return SearchService;})
我在stackoverflow看了很多,但我只能找到解决方案,当控制器加载而不是单击按钮时,调用async(搜索)函数。如果我错过任何信息或问题格式不正确,请告诉我,这是我要问的第一个问题。 谢谢。
答案 0 :(得分:1)
angularJS中的控制器设计为包含结构 - 它不是单例。您已经定义了两个单独的SearchController实例,一个在菜单中,另一个在结果页面中。
在第一次搜索中为什么的原因是因为您更新了SearchService的数据,然后移到结果视图(在加载时更新自己加载服务数据)
您可以在此处看到,您有两个不同的范围,具有两个不同的搜索结果数组。菜单栏中的搜索控制器:
主页中的搜索控制器:
解决方案是将服务用作搜索结果的“所有者”,并从控制器访问这些服务。这意味着将SearchService暴露给$ scope,并在视图中使用in,例如:
@Entity
@Indexed
public class B {
@IndexedEmbedded(includePaths="a.b")
@ManyToOne
private A a;
......
}
在你的模板中,做
.controller('SearchController',function($scope,$location,SearchService,$http) {
$scope.keyword="";
$scope.options={};
$scope.group;
$scope.SearchService = SearchService;