我有一个用AngularJS编写的单页应用程序,并使用ui-router来管理状态转换(路由)。如何维护路线更改之间的视图(控制器)状态?
没有配置这样的搜索状态:
function config($stateProvider) {
$stateProvider
.state('social.search', {
url: '/search',
templateUrl: 'views/social/search/social-search-view.html',
controller: 'SocialSearchController',
controllerAs: 'vm'
});
}
该视图生成一个表单,并且所述控制器(SocialSearchController
)开获得这些输入,它们submiting到服务和显示结果的照顾。结果列表显示为用户排名列表(如Google的搜索结果页面)。每个结果都有一个链接转到一个新的状态,以显示有关条目的详细信息,例如:
<a ui-sref="social.profile({personId: person.id})">{{person.name}}</a>
的social.profile
状态在应用程序的其他部分使用,所以它不是social.search
孩子,其配置是这样的:
function config($stateProvider) {
$stateProvider.state('social.profile', {
url: '/{personId}',
templateUrl: 'views/social/profile/social-profile-view.html',
controller: 'SocialProfileController',
controllerAs: 'vm'
});
}
它的工作很好,我可以输入我的搜索,得到的结果,然后单击以查看有关条目的详细信息。但是,当我点击后退按钮从详细视图切换回搜索视图时,我的输入和搜索结果都消失了。我知道这是默认和正确的行为,因为如果不再使用控制器,则不需要将控制器保存在内存中。
的事情是,在这个特殊的情况下,我想控制器留在记忆莫名其妙,所以用户不需要重新输入查询,并出具了搜索服务的另一个请求。
我能想到保存搜索状态为服务,使控制器从它抓住它的初始状态,就像一个高速缓存服务只是为了保存最后一个控制器的状态。但后来我容易参与这个同步过程的错误,搜索形式是有点复杂,因为它涉及到(我做了自定义指令)自动完成和标签字段,以便将同步会通至少三个“层次” :控制器状态,缓存服务,自定义输入。
这是这样做的正确方法?我有什么选择?
怎么样增加对您的搜索结果(“/搜索/ {}搜索字符串”)另一种观点。您的表单将“提交”到该视图,并且profliel视图中的后退按钮将起作用。 – richardtz 2014-12-09 12:41:06
我有比单个搜索字符串更多的字段,但我明白了你的观点(保持路由url中的输入状态)。这将为用户避免重新键入而起作用,但会为搜索服务(后端)重新填充结果列表提出新请求。 – 2014-12-09 12:48:42
我认为再次提出请求是正确的,(例如,您可能会有新的结果显示),但这可能取决于您的要求。 – richardtz 2014-12-09 13:32:22