Java итерации по карте с SimpleEntry

Я хотел поделиться другим решением, работающим с 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, но он работает.

Надеюсь, это может помочь кому угодно.

0
задан rainer 31 March 2019 в 18:00
поделиться

3 ответа

Во-первых, возьми ответ @ Bohemian, это то, что ты хочешь. и любые будущие гугл. Это не работает, потому что у вас есть ошибка: D (именно поэтому мы все приходим к переполнению стека, в зависимости от вашего определения ошибки)

SimpleEntry simpleEntry = new SimpleEntry ("", "");

...

actionMap.put (stringkey, simpleEntry entry );

это помогает?

0
ответ дан DefyGravity 31 March 2019 в 18:00
поделиться

Я не понимаю твой вопрос ...

Но как мне получить второе и третье значения карты, которые определены SimpleEntry?

Поскольку не совсем ясно, что именно вы ищете (что является вероятно, почему вы не смогли найти ответ) вот несколько (но не всех) способов перебора карты:

// 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!
});

0
ответ дан Paul 31 March 2019 в 18:00
поделиться

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>, и / или использовать классы с (именованными) полями для хранения ваших данных.

0
ответ дан Bohemian 31 March 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: