0
我有一個應用程序在我的主狀態,使下決心,使HTTP調用,並獲取數組做出決議時機不好或命令的功能。與UI的路由器
然後,孩子陣列應該顯示此數組中一個對象,但似乎來自控制器的變量太早定義,不得到正確更新,等孩子出來空。
我已經試過了沒有HTTP調用(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'
}
}
})
})
我已經成功地複製這一問題在Plunkr。
這是一個反...查看:?什麼是明確的承諾,建設反模式,如何避免它(HTTPS: //stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it) – charlietfl
謝謝你的評論。如果在解決響應之前沒有對響應執行聚合/轉換邏輯,則它只是一種反模式。例如,如果在上面的代碼中,我們在成功地立即解析了響應而沒有對響應執行任何計算,它可能被認爲是反模式,並且被$ http調用中的簡單返回代替。但是,在這種情況下,我們有循環邏輯需要在解決之前對響應執行。這保證需要使用$ q.defer() – CodeWarrior
不,它不需要。可以用'then()'方法很容易地操作,只需要'return service.flatexhibitors'。有沒有必要額外在這種情況下推遲,它顯然屬於反模式,如圖 – charlietfl