使用UI-Router解决在每次状态更改时复制的数组

时间:2017-07-29 13:18:48

标签: angularjs angular-ui-router

我正在运行一个应用,其中导航包含触发状态更改的多语言链接。

我遇到的问题是,从一种语言到另一种语言的每个状态变化,来自状态解析的数组都会重复。

例如:

  • 首次加载= 8项
  • 首次状态更改= 16项
  • 第二次状态变化= 24项
  • ...

我创建了Plunker to replicate the issue

这是我的州代码:

belongsTo

工厂:

.config(function($stateProvider) {


  $stateProvider.state('fair', {
    url: '/fair/{fair}',
    resolve: {
      fair: function(SearchService, $stateParams) {
        var string = $stateParams.fair.replace(/-/g , "");
        var finalstring = string.replace(/liste/g , " ");
        return SearchService.getAllExhibitors(finalstring);
      }
    },
    views: {
      'header': {   
        templateUrl: 'header.htm',
        controller:'appCtrl'   
      },
      'main':{    
        templateUrl: 'fair.htm',
        controller: 'appCtrl'
      }    
    }
  })

  .state('fairde', {
    url: '/de/fair/{fair}',
    resolve: {
      fair: function(SearchService, $stateParams) {
        var string = $stateParams.fair.replace(/-/g , "");
        var finalstring = string.replace(/liste/g , " ");
        return SearchService.getAllExhibitors(finalstring);
      }
    },
    views: {
      'header': {   
        templateUrl: 'headerde.htm',
        controller:'appCtrl'      
      },
      'main':{    
        templateUrl: 'fairde.htm',
        controller: 'appCtrl'
      }    
    }
  })

1 个答案:

答案 0 :(得分:1)

您已使用SearchService,并且正在将数据推送到其中。 请记住工厂只会初始化一次,这意味着它只会初始化您的服务变量一次,其中flatexhibitorsdatafairs您正在以不同的状态解析注入相同的服务,那么它将会是什么做... 例如,在第一次注射时你有这个

/*
service = {
  flatexhibitors : [],
  datafairs : [],
  and 
  <your function>

}
after first injection your variable will be
service = {
  flatexhibitors = [array] // not null
  datafairs = [arra] //not null
}
*/

因此,当您将其注入第二个控制器或服务或解析您正在执行的功能时,请记住您的变量不会为空。

所以你可以这样做,如果你想让它总是这样就把它设置为null ..

.factory("SearchService", function($http, $q) {  

  var service = {
    flatexhibitors : [],
    datafairs : [],
    getAllExhibitors : function (wop) {
      var deferred = $q.defer();
      //setting to null
      this.flatexhibitors = [];
      this.datafairs = [];
      var searchindex = wop;
        var url = 'https://openwallsgallery.com/cors/getexhibitors.php';
        var config = {
            params: {
                search: searchindex
            },
            cache:true
        };
        $http.get(url, config).then(function (data) {
          service.datafairs = data.data.rows;
          for (var i in service.datafairs) {
            service.flatexhibitors.push(service.datafairs[i].doc);
          };
          deferred.resolve(service.flatexhibitors);
        }, function (error) {
          console.log(error);
          deferred.reject(error);
        });
        return deferred.promise; 
    }

  }
  return service;

})