2017-07-29 82 views
0

我正在運行一個應用程序,其中導航包括觸發狀態更改的多語言鏈接。使用UI解決陣列在每次狀態變化時都會被重複使用UI-Router

我遇到的問題是,在從一種語言到另一種語言的每種狀態變化中,來自狀態解析的數組都會被複制。

例如:

  • 首先負載= 8項
  • 第一狀態變化= 16項
  • 第二狀態變化= 24項
  • ...

I」我創建了一個Plunker to replicate the issue

這裏是我的狀態代碼:

.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' 
     }  
    } 
    }) 

,工廠:

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

    var service = { 
    flatexhibitors : [], 
    datafairs : [], 
    getAllExhibitors : function (wop) { 
     var deferred = $q.defer(); 
     var searchindex = wop; 
     var url = '../register/backend/databaseconnect/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; 

}) 
+0

不明白爲什麼你需要2個獨立的陣列,不只是返回'數據在'then()'中使用.data.rows' – charlietfl

回答

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 
} 
*/ 

所以當你注入它在第二個控制器或服務或解決你正在做的功能記住你的變量不會爲空。

所以你可以將其設置爲空,如果你希望它是空永遠只是這樣的..

.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; 

}) 
+0

使用$ q.defer()和'$ http'是一種反模式,因爲'$ http'已經返回一個承諾 – charlietfl

+0

是的,你是對的,但我已經複製了他的代碼並沒有更新他的功能 –

+0

@charlietfl我被告知使用$ q除了http [這裏](https://stackoverflow.com/questions/45355474/bad-timing-or-order-of-functions-with-resolves -on-ui-router):// –

相關問題