我正在运行一个应用,其中导航包含触发状态更改的多语言链接。
我遇到的问题是,从一种语言到另一种语言的每个状态变化,来自状态解析的数组都会重复。
例如:
我创建了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'
}
}
})
答案 0 :(得分:1)
您已使用SearchService,并且正在将数据推送到其中。
请记住工厂只会初始化一次,这意味着它只会初始化您的服务变量一次,其中flatexhibitors
和datafairs
您正在以不同的状态解析注入相同的服务,那么它将会是什么做...
例如,在第一次注射时你有这个
/*
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;
})