Я хотел поделиться другим решением, работающим с ui router 1.0.0.X
Как вы знаете, stateChangeStart и stateChangeSuccess теперь устарели. https://github.com/angular-ui/ui-router/issues/2655
Вместо этого вы должны использовать $ transitions http: // angular-ui. github.io/ui-router/1.0.0-alpha.1/interfaces/transition.ihookregistry.html
Вот как я это достиг:
Сначала я have и AuthService с некоторыми полезными функциями
angular.module('myApp')
.factory('AuthService',
['$http', '$cookies', '$rootScope',
function ($http, $cookies, $rootScope) {
var service = {};
// Authenticates throug a rest service
service.authenticate = function (username, password, callback) {
$http.post('api/login', {username: username, password: password})
.success(function (response) {
callback(response);
});
};
// Creates a cookie and set the Authorization header
service.setCredentials = function (response) {
$rootScope.globals = response.token;
$http.defaults.headers.common['Authorization'] = 'Bearer ' + response.token;
$cookies.put('globals', $rootScope.globals);
};
// Checks if it's authenticated
service.isAuthenticated = function() {
return !($cookies.get('globals') === undefined);
};
// Clear credentials when logout
service.clearCredentials = function () {
$rootScope.globals = undefined;
$cookies.remove('globals');
$http.defaults.headers.common.Authorization = 'Bearer ';
};
return service;
}]);
Тогда у меня есть эта конфигурация:
angular.module('myApp', [
'ui.router',
'ngCookies'
])
.config(['$stateProvider', '$urlRouterProvider',
function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/resumen');
$stateProvider
.state("dashboard", {
url: "/dashboard",
templateUrl: "partials/dashboard.html",
controller: "dashCtrl",
data: {
authRequired: true
}
})
.state("login", {
url: "/login",
templateUrl: "partials/login.html",
controller: "loginController"
})
}])
.run(['$rootScope', '$transitions', '$state', '$cookies', '$http', 'AuthService',
function ($rootScope, $transitions, $state, $cookies, $http, AuthService) {
// keep user logged in after page refresh
$rootScope.globals = $cookies.get('globals') || {};
$http.defaults.headers.common['Authorization'] = 'Bearer ' + $rootScope.globals;
$transitions.onStart({
to: function (state) {
return state.data != null && state.data.authRequired === true;
}
}, function () {
if (!AuthService.isAuthenticated()) {
return $state.target("login");
}
});
}]);
Вы можете видеть, что я использую
data: {
authRequired: true
}
для отметьте состояние доступным только в том случае, если оно аутентифицировано.
, затем на .run я использую переходы для проверки состояния, прошедшего проверку.
$transitions.onStart({
to: function (state) {
return state.data != null && state.data.authRequired === true;
}
}, function () {
if (!AuthService.isAuthenticated()) {
return $state.target("login");
}
});
Я построю этот пример, используя некоторый код, найденный в документация по переходу $. Я довольно новичок в маршрутизаторе ui, но он работает.
Надеюсь, это может помочь кому угодно.
Во-первых, возьми ответ @ Bohemian, это то, что ты хочешь. и любые будущие гугл. Это не работает, потому что у вас есть ошибка: D (именно поэтому мы все приходим к переполнению стека, в зависимости от вашего определения ошибки)
SimpleEntry simpleEntry = new SimpleEntry ("", ""); strike>
...
actionMap.put (stringkey, simpleEntry strike> entry );
это помогает?
Я не понимаю твой вопрос ...
Но как мне получить второе и третье значения карты, которые определены SimpleEntry?
blockquote>Поскольку не совсем ясно, что именно вы ищете (что является вероятно, почему вы не смогли найти ответ) вот несколько (но не всех) способов перебора карты:
// I'm changing your map a little to avoid confusion over the word 'Entry'. Map<String, SimpleEntry<String, String>> treeMap = new TreeMap<>(); for (Map.Entry<String, SimpleEntry<String, String>> ent: treeMap.entrySet()) { String key = ent.getKey(); SimpleEntry val - ent.getValue(); }
Если вы используете Java 8 или более позднюю версию ... [ 115]
// Using your original map Map<String, Entry<String, String>> treeMap = new TreeMap<>(); treeMap.forEach((key, value) -> { // key is a String, value is an Entry<String, String>> }); // Explicit parameter types can increase code readability treeMap.forEach((String key, Entry<String, String>> value) -> { // Have fun with the contents of your map! });
Map.keySet()
(неудивительно) возвращает клавиш , а не значений .
Чтобы получить значения , используйте (опять же, что неудивительно) Map.values()
.
Итерация по всем парам ключ / значение, то есть записей :
for (Map.Entry<String, Entry<String, String>> entry : treeMap.entrySet()) {
// showing how to get at the parts:
String key = entry.getKey();
String valueKey = entry.getValue().getKey();
String valueValue = entry.getValue().getValue();
}
Это необычный способ решения любой проблемы, которую вы пытаетесь решить потому что каждый ключ имеет только одно значение, поэтому у вас есть «ключ -> ключ -> значение», которое совпадает с просто «ключ -> значение». Попробуйте отказаться от карты внешнего слоя и использовать только Map<String, String>
, и / или использовать классы с (именованными) полями для хранения ваших данных.