2017-07-25 107 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是不够用了一个很有益的事情。