2017-07-25 102 views
0

我試圖在與取決於我在視圖中的不同值的HTTP調用搜索傳遞變量從配置到工廠AngularJS和UI路由器

我廠是這樣的:

.factory('SearchService', ['$http','$filter', function($http, $filter) { 

    var service = { 

    getAllExhibitors : function() { 
     var searchindex = 'Berliner'; 
     var url = '...'; 
     var config = { 
      params: { 
       search: searchindex 
      }, 
      cache:true 
     }; 
     $http.get(url, config).then(function (data) { 
      service.datafairs = data.data.rows; 
      ... 
     }); 
    }... 

正如你可以看到我傳遞一個硬編碼的變量searchindex作爲參數進行搜索。

我能設置這個變量取決於我在看待?

我對路由器的配置是這樣的:

.config(function($stateProvider) { 

    var berlinerState = { 
    name: 'berliner', 
    url: '/berlinerliste/', 
    views: { 
     'header': { 
     templateUrl: 'header.htm' 
     }, 
     'main':{  
     templateUrl: 'bl2017.htm'  
     } 
    } 
    } 

    var koelnerState = { 
    name: 'koelner', 
    url: '/koelnerliste/', 
    views: { 
     'header': { 
     templateUrl: 'header.htm' 
     }, 
     'main':{  
     templateUrl: 'kl2017.htm'  
     } 
    } 
    } 

    ... 

例如,上/ berlinerliste,searchindex = X和/ koelnerliste,searchindex = Y

任何提示嗎?

回答

0

從當你打電話給工廠控制器,你可以通過實際的國家名,並根據此值來定義的getAllExhibitors方法searchIndex。

getAllExhibitors : function (stateName) { 
    var searchindex = ''; 
    var url = '...'; 
    var config = { 
     params: { 
      search: searchindex 
     }, 
     cache:true 
    }; 
    if(stateName === 'berliner'){ 
     config.params.search = 'asdf' 
    } 
    .... 

    $http.get(url, config).then(function (data) { 
     service.datafairs = data.data.rows; 
     ... 
    }); 
}... 

,並從控制器注入$狀態服務,併發送至方法的$state.current.name

另一種方式是直接在您的服務注入$狀態的服務,這樣的價值:

.factory('SearchService', ['$http','$filter','$state', function($http, $filter, $state){ 

     var service = { 

    getAllExhibitors : function() { 
     var searchindex = 'Berliner'; 
     var url = '...'; 
     var config = { 
      params: { 
       search: searchindex 
      }, 
      cache:true 
     }; 
     if($state.current.name === 'berliner') { 
      config.params.search = 'asdf' 
     } 
    .... 
     $http.get(url, config).then(function (data) { 
      service.datafairs = data.data.rows; 
     ... 
    }); 
}... 
+0

當我做的console.log($狀態);,現在回來空! –

+0

你在哪裏做它的console.log($狀態)? –

+0

在控制器中。我設法在控制器中使用$ watch函數來獲取狀態。現在我正在研究如何與國家名稱這個新的$範圍變量傳遞到工廠... –

0

當異步API,例如HTTP $工作,最好是回報承諾:

app.service('SearchService', function($http, $filter) {  
    this.getAllExhibitors = function (searchArg) { 
     var searchindex = searchArg || 'Berliner'; 
     var url = '...'; 
     var config = { 
      params: { 
       search: searchindex 
      }, 
      cache:true 
     }; 
     //RETURN promise 
     ͟r͟e͟t͟u͟r͟n͟ $http.get(url, config).then(function (response) { 
       ͟r͟e͟t͟u͟r͟n͟ response.data.rows;    
     }); 
    }; 
}); 

然後,在控制器中,從許提取數據:

app.controller("viewController", function($scope, SearchService, $state) { 
    var searchArg = $state.current.name; 
    var promise = SearchService.getAllExhibitors(searchArg); 
    promise.then(function(rows) { 
     $scope.rows = rows; 
    }); 
}); 

還要注意的getAllExhibitors功能已被修改以接受search參數。

return statement是不夠用了一個很有益的事情。