2017-07-29 3 views
0

Ich verwende eine App, bei der die Navigation einen mehrsprachigen Link enthält, der eine Statusänderung auslöst.Resolve-Array wird bei jeder Statusänderung mit UI-Router dupliziert.

Das Problem, auf das ich stoße, ist, dass bei jedem Statuswechsel von einer Sprache in die andere das Array, das aus der Statusauflösung kommt, dupliziert wird.

Zum Beispiel:

  • Ersten Last = 8 Artikel
  • erste Zustandswechsel = 16 Artikel
  • zweite Zustandsänderung = 24 Artikel
  • ...

I‘ ve erstellt eine Plunker to replicate the issue.

Hier ist mein Zustand Code:

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

Und die Fabrik:

.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

verstehe nicht, warum Sie zwei separate Arrays müssen und zurück nicht nur 'Daten .data.rows 'in' then() ' – charlietfl

Antwort

1

Sie haben Ihre Searchservice verwendet und Sie Daten hinein drängen. Denken Sie daran, Fabrik wird nur initialisiert, wenn es bedeutet, dass es Ihre Service Variable nur einmal initialisiert werden, welche flatexhibitors hat und datafairs Sie denselben Dienst in verschiedenen staatlichen resolve injizieren, so was wird es ... für ein Beispiel in der ersten Injektion tun Sie haben diese

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

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

so, wenn Sie es in der zweiten Controller oder eine Dienstleistung injizieren oder Funktion beheben, die Sie Ihre Variable wird nicht null sein erinnern tun.

so können Sie tun, und legen Sie es auf null, wenn Sie es wollen, wie dies immer nur null sein ..

.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

$ qdefer() mit' $ http' ist ein Anti-Pattern, da '$ http' bereits ein Versprechen zurückgibt – charlietfl

+0

Ja, Sie haben Recht, aber ich habe seinen Code kopiert und nicht aktualisiert seine Funktion –

+0

@charlietfl Ich habe gesagt, $ q zusätzlich zu http [hier] (https://stackoverflow.com/questions/45355474/bad-timing-or-order-of-functions-with-resolves verwenden -on-ui-router): // –

Verwandte Themen