2017-07-27 157 views
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

回答

1

更改getAllExhibitors返回一個promise象下面這樣:

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; 
    }); 
} 
+1

這是一個反...查看:?什麼是明確的承諾,建設反模式,如何避免它(HTTPS: //stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it) – charlietfl

+1

謝謝你的評論。如果在解決響應之前沒有對響應執行聚合/轉換邏輯,則它只是一種反模式。例如,如果在上面的代碼中,我們在成功地立即解析了響應而沒有對響應執行任何計算,它可能被認爲是反模式,並且被$ http調用中的簡單返回代替。但是,在這種情況下,我們有循環邏輯需要在解決之前對響應執行。這保證需要使用$ q.defer() – CodeWarrior

+1

不,它不需要。可以用'then()'方法很容易地操作,只需要'return service.flatexhibitors'。有沒有必要額外在這種情況下推遲,它顯然屬於反模式,如圖 – charlietfl