2014-12-09 37 views
0

我有一个用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' 
    }); 
} 

它的工作很好,我可以输入我的搜索,得到的结果,然后单击以查看有关条目的详细信息。但是,当我点击后退按钮从详细视图切换回搜索视图时,我的输入和搜索结果都消失了。我知道这是默认和正确的行为,因为如果不再使用控制器,则不需要将控制器保存在内存中。

的事情是,在这个特殊的情况下,我想控制器留在记忆莫名其妙,所以用户不需要重新输入查询,并出具了搜索服务的另一个请求。

我能想到保存搜索状态为服务,使控制器从它抓住它的初始状态,就像一个高速缓存服务只是为了保存最后一个控制器的状态。但后来我容易参与这个同步过程的错误,搜索形式是有点复杂,因为它涉及到(我做了自定义指令)自动完成和标签字段,以便将同步会通至少三个“层次” :控制器状态,缓存服务,自定义输入。

这是这样做的正确方法?我有什么选择?

+0

怎么样增加对您的搜索结果(“/搜索/ {}搜索字符串”)另一种观点。您的表单将“提交”到该视图,并且profliel视图中的后退按钮将起作用。 – richardtz 2014-12-09 12:41:06

+0

我有比单个搜索字符串更多的字段,但我明白了你的观点(保持路由url中的输入状态)。这将为用户避免重新键入而起作用,但会为搜索服务(后端)重新填充结果列表提出新请求。 – 2014-12-09 12:48:42

+0

我认为再次提出请求是正确的,(例如,您可能会有新的结果显示),但这可能取决于您的要求。 – richardtz 2014-12-09 13:32:22

回答

0

我不知道,UI路由器是否保持父母与childstates之间的控制器和DATAS,但如果是这样的话,你可以尝试“复制”你的状态。

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> 

在此配置您的socialProfile是搜索的一个子状态,但仍然是一个独立的状态以及

+0

这似乎工作,但我需要添加一个'ui-view'到父状态来显示详细的视图。就我而言,我希望这个孩子“ui-view”占据整个视野。任何方式来做'ng-if'或者类似的东西来检查是否有子状态? – 2014-12-09 13:40:36

相关问题