从服务获取异步数据后,角度js更新范围的问题

时间:2015-05-11 08:57:17

标签: javascript angularjs

我喜欢在角度js中对http资源进行搜索。只要我从结果页面以外的任何其他页面搜索,Evertything就可以了。如果我再次搜索结果页面,我会得到结果对象,但范围不会更新。您可以在此处找到此行为的示例: Example page

重现的步骤:

  1. 输入" pax6"进入菜单栏的搜索栏。认识到您被转发到结果页面。
  2. 继续搜索页面,在搜索字段中输入pax8。您将收到对象,但范围不会更新。
  3. 点击除搜索之外的任何其他链接
  4. 再次点击搜索,现在视图显示正确的值
  5. 以下是我实现该功能的方法:

    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(搜索)函数。如果我错过任何信息或问题格式不正确,请告诉我,这是我要问的第一个问题。 谢谢。

1 个答案:

答案 0 :(得分:1)

angularJS中的控制器设计为包含结构 - 它不是单例。您已经定义了两个单独的SearchController实例,一个在菜单中,另一个在结果页面中。

在第一次搜索中为什么的原因是因为您更新了SearchService的数据,然后移到结果视图(在加载时更新自己加载服务数据)

您可以在此处看到,您有两个不同的范围,具有两个不同的搜索结果数组。菜单栏中的搜索控制器:

SearchController in the menu bar

主页中的搜索控制器:

enter image description here

解决方案是将服务用作搜索结果的“所有者”,并从控制器访问这些服务。这意味着将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;