如何在路由更改之间维护视图(控制器)状态
How to maintain view (controller) state between route changes?
我有一个用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
(负责获取这些输入,将它们提交到服务并显示结果。结果列表以排名列表的形式显示给用户(如 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'
});
}
它工作正常,我可以输入我的搜索,获取结果,然后单击以查看有关条目的详细信息。但是,当我点击后退按钮从详细视图转换回搜索视图时,我的输入和搜索结果消失了。我知道这是默认和正确的行为,因为如果不再使用控制器,则无需将控制器保留在内存中。
问题是,在此特定方案中,我希望控制器以某种方式保留在内存中,因此用户无需重新键入查询并发出另一个搜索服务请求。
我可以考虑将搜索状态保存到服务中,并使控制器从中获取其初始状态,类似于缓存服务,仅用于存储最后一个控制器的状态。但是我很容易受到此同步过程中涉及的错误的影响,搜索表单有点复杂,因为它涉及自动完成和标记字段(我制作的自定义指令(,因此同步将至少通过三个"层":控制器状态、缓存服务、自定义输入。
这是正确的方法吗?我有哪些选择?
我不确定 ui-router 是否在父状态和子状态之间保留控制器和数据,但如果是这种情况,您可以尝试"复制"您的状态。
function config($stateProvider) {
var socialProfile = {
url: '/{personId}',
templateUrl: 'views/social/profile/social-profile-view.html',
controller: 'SocialProfileController',
controllerAs: 'vm' }
$stateProvider
.state('social.search', {
url: '/search',
templateUrl: 'views/social/search/social-search-view.html',
controller: 'SocialSearchController',
controllerAs: 'vm'
});
$stateProvider.state("social.search.detail', socialProfile);
$stateProvider.state('social.profile', socialProfile);
}
在"social.search"视图中,你可以有一个特殊的href
。<a ui-sref="social.search.detail({personId: person.id})">{{person.name}}</a>
在此配置中,您的社交配置文件是搜索的子状态,但也保持独立状态
- 将范围添加到角度种子默认视图控制器时,测试套件现在失败
- 设置子视图控制器 EmberJS
- 使用emberjs测试视图控制器
- UIwebview图片到新的视图控制器
- 节点.js中的模型-视图-控制器模式
- 如何通过不同的视图/控制器在特定元素上设置 ng-show
- Extjs 5.1:视图控制器中的方法未调用
- 视图控制器和恩约
- 如何在路由更改之间维护视图(控制器)状态
- 角度.js分页过滤的数据并显示总项目,而无需在视图/控制器中复制代码
- 嵌套视图控制器和ng-click-AngularJs
- 视图/控制器不会使用 push() 函数刷新,使用 angularjs 中的 socket.io
- 如何在状态管理器视图控制器中传递已解析的依赖项
- 建议:在JavaScript中难以使用模型视图控制器
- 在Angular JS中动态加载视图/控制器
- 如何将数据从主控制器发射到角度视图控制器
- 如何在Rails视图控制器中访问HTML5本地存储
- 在Angular中,如何重新初始化视图'控制器中的$scope变量?
- 跨视图控制器传输值不工作
- 视图控制器需要:属性不工作