【发布时间】:2016-10-19 04:47:06
【问题描述】:
我使用 AngularJS、UI Router 和 Elasticsearch 构建了一个小型搜索应用程序。我有 2 个共享 1 个控制器的模板。一切正常......除了我尝试实现查询参数时。
一个模板是一个简单的 hp,用于输入搜索查询或从自动完成中选择(UI Bootstrap Typeahead)。另一个模板用于搜索结果和更多搜索(搜索框和显示搜索结果的区域)。
我的状态如下所示:
.state('query', {//home
url: '/',
templateUrl: 'search/query.html',
controller: 'searchCtrl as vm'
})
.state('search', {//results
url: '/search?q',
templateUrl: 'search/search.html',
controller: 'searchCtrl as vm'
});
我正在使用 UI Router 中的 $state.go(在 searchCtrl 中)在状态之间进行转换。
vm.search = function() {
$state.go('search', {q: vm.searchTerms});
...
发生的情况是,在您输入查询/选择自动完成后,它会进入“搜索”状态,但我看到这是在 url 中
http://localhost:8000/app/#/search?q=%5Bobject%20Object%5D
那我又要输入查询了,url变成了
http://localhost:8000/app/#/search?q=userinput
最后我必须再次输入查询才能执行搜索。显然,我希望所有这一切都发生在一次搜索提交中。我做错了什么?
有什么建议或想法吗?
更新 我在一个单独的 run.js 文件中有这个
.run(['$rootScope', '$state', '$stateParams', function($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
更新 2
无论我使用我的代码还是您的代码,我都会遇到同样的错误。似乎当我从“状态”转到“状态”时,由于$scope works in Angular 的方式,searchTerms 正在被重置。我不确定如何解决这个问题,因为我不确定那里提供的解决方案是否适用于controllerAs 语法。为 hp/query 页面设置一个 autocompleteCtrl 并为 searchTerms 注入一个 queryService 到每个控制器中会更明智吗?请多花一点时间来分叉 codepen,完成后会给您发送评论。
【问题讨论】:
标签: angularjs angular-ui-router