有几种方法,其中两种似乎相当可靠。我最终为我的应用选择了第一种方法,因为我的搜索参数需要传播到其他控制器。
将它们存储在 cookie 中
Angular.js 提供$cookies 允许在浏览器上获取/设置参数。我将其用作搜索参数的 true 来源。
例如:
search.service.js
angular
.module('app')
.service('SearchService', SearchService);
SearchService.$inject = [
'$cookies'
];
function SearchService(
$cookies
) {
var searchCookieKey = 'searchHistoryCookieKey';
var searchCookieMaxSize = 10;
return {
search: search,
getSearchHistory: getSearchHistory
};
function search(arg1, arg2) {
storeSearchHistory({arg1: arg1, arg2: arg2});
// do your search here
// also, you should cache your search so
// when you use the 'most recent' params
// then it won't create another network request
}
// Store search params in cookies
function storeSearchHistory(params) {
var history = getSearchHistory();
history.unshift(params); // first one is most recent
if(history.length > searchCookieMaxSize) {
history.pop();
}
$cookies.putObject(searchCookieKey, history);
}
// Get recent history from cookies
function getSearchHistory() {
return $cookies.getObject(searchCookieKey) || [];
}
}
app.states.js
.state('search', {
url: "/search",
templateUrl: "/dashboard/search/templates/index.html",
controller: 'SearchController',
resolve: {
searchResults: ['SearchService', '$stateParams', function(SearchService, $stateParams) {
if(!$stateParams.arg1 || !$stateParams.arg2) {
var history = SearchService.getSearchHistory();
var mostRecent = history.length ? history[0] : null;
if(mostRecent) {
return SearchService.search(mostRecent.arg1, mostRecent.arg2);
}
}
return SearchService.search($stateParams.arg1, $stateParams.arg2);
}]
}
})
如果您没有缓存这些搜索网络调用,那么您的应用将需要等待请求返回,从而降低您的应用速度。
在各州传递它们
您可以创建一个包含$stateParams 的父控制器,您的子控制器将继承这些参数。后退/前进或在子状态之间访问时不会覆盖参数。但是,当您使用特定参数移动状态时,它们会被覆盖。因此,您只需要在状态之间移动时明确指定这些父级的$stateParams。