2017-07-29 7 views
0

私は、ナビゲーションに状態の変更を引き起こす多言語リンクが含まれているアプリケーションを実行しています。UI-Routerですべての状態変更で配列が重複することを解決しました

私は、実行中の問題は、ある言語から別の言語へのすべての状態変更で、状態解決から来る配列が重複してしまうことです。例えば

  • まず負荷= 8つの項目
  • まず状態変化= 16の項目
  • 第二の状態変化= 24の項目
  • ...私は「

veは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つの別々の配列を必要とする理由を理解しないでください、ちょうど 'データを返しません。 .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 
} 
*/ 

を持っているので、文句を言わないnullになります。

あなたはそれだけで、このように常に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; 

}) 
+0

'$ http'を使って$ q.defer()を使うことはアンチパターンです。' $ http'が既に約束を返すから – charlietfl

+0

はい、あなたは正しいですが、彼のコードをコピーしました彼の機能は更新されていません –

+0

@charlietfl http [here](https://stackoverflow.com/questions/45355474/bad-timing-ororder-of-functions-with-resolves)に加えて$ qを使用するように言われました-on-ui-router):// –

関連する問題