Angularjs Ui路由器上解析函数的错误计时或顺序
我有一个应用程序,我的主状态进行解析,进行http调用并获取数组 然后,子数组应该显示这个数组中的一个对象,但是似乎控制器中的变量定义得太早,没有得到正确的更新,所以子数组是空的 我在没有http调用的情况下尝试过它(Angularjs Ui路由器上解析函数的错误计时或顺序,angularjs,arrays,angular-ui-router,Angularjs,Arrays,Angular Ui Router,我有一个应用程序,我的主状态进行解析,进行http调用并获取数组 然后,子数组应该显示这个数组中的一个对象,但是似乎控制器中的变量定义得太早,没有得到正确的更新,所以子数组是空的 我在没有http调用的情况下尝试过它(var-array=[array]),它工作得很好,但不适合http调用 关于如何解决这个问题有什么建议吗 以下是控制器: .controller('appCtrl',['$scope', 'SearchService','fair', function($scope, Searc
var-array=[array]
),它工作得很好,但不适合http调用
关于如何解决这个问题有什么建议吗
以下是控制器:
.controller('appCtrl',['$scope', 'SearchService','fair', function($scope, SearchService, fair){
$scope.data = SearchService;
$scope.datafairs = $scope.data.flatexhibitors;
console.log($scope.datafairs);
}])
.controller('ChildController',['$scope', 'exhibitor', '$filter', function($scope, exhibitor, $filter){
$scope.$watch(function() { return $scope.fair; }, function(newVal) {
$scope.fairs = newVal;
console.log($scope.fairs);
$scope.chosenexhibitor = $filter("filter")($scope.fairs, {'slug':exhibitor}, true);
}, true);
}])
服务:
.factory("SearchService", function($http) {
var service = {
flatexhibitors : [],
datafairs : [],
getAllExhibitors : function (wop) {
var searchindex = wop;
console.log(searchindex);
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);
};
return service.flatexhibitors;
});
}
}
return service;
})
各国:
.config(function($stateProvider) {
$stateProvider.state('berliner', {
url: '/berlinerliste',
params : {search: 'Berliner 2017'},
resolve: {
fair: function(SearchService, $stateParams) {
return SearchService.getAllExhibitors($stateParams.search);
}
},
views: {
'header': {
templateUrl: 'header.htm'
},
'main':{
templateUrl: 'bl2017.htm',
controller: 'appCtrl'
}
}
})
.state('berliner.exhibitor', {
url: '/{id}',
resolve: {
exhibitor: function($stateParams) {
var slug = $stateParams.id;
return slug;
}
},
views: {
'header': {
templateUrl: 'header.htm'
},
'wop':{
templateUrl: 'exhibitor.htm',
controller: 'ChildController'
}
}
})
})
我成功地在一个中复制了该问题。更改
getAllExhibitors
以返回一个承诺,如下所示:
getAllExhibitors : function (wop) {
var searchindex = wop;
console.log(searchindex);
var url = '../register/backend/databaseconnect/getexhibitors.php';
var config = {
params: {
search: searchindex
},
cache:true
};
return $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);
};
return service.flatexhibitors;
});
}
这是一个反模式。。。见:谢谢你的评论。只有在解析响应之前没有对响应执行聚合/转换逻辑时,它才是反模式。例如,如果在上面的代码中,我们在成功时立即解析了响应,而没有对响应执行任何计算,那么它可能被视为反模式,并被$http调用的简单返回所取代。但是,在本例中,我们有循环逻辑,需要在解决响应之前对其执行循环逻辑。这就保证了使用$q.defer()的必要性。不,它不是。可以以同样的方式在then()
中轻松操作,只需执行退货服务即可。在这种情况下,不需要额外的延迟,它显然符合反模式,请记住,then()
本身也会返回一个promiseI,包括在我的应用程序中,它工作完美,谢谢大家@代码战士