angularjs base64 url​​参数太长

时间:2017-06-12 10:01:03

标签: javascript angularjs

我正在努力为我遇到的问题找到合适的解决方案。 基本上我有一组可以跨视图回答的问题。我希望这样我可以复制网址并将其粘贴给另一个人,他们将得到我所拥有的确切问题和答案。 我不想使用大量的查询参数,所以我决定使用我的问题对象,然后在运行中对其进行解码,这听起来像是一个好的计划。

所以我用bower安装 angular-base64 并创建了一个简单的编码方法:

function encode(groups) {
    var simpleQuestions = groups.map(function (group) {
        var questions = group.questions.map(function (question) {
            return { id: question.id, answer: question.answer };
        })
        return { id: group.id, questions: questions };
    });
    return $base64.encode(angular.toJson(simpleQuestions));
};

这会完美地生成字符串。 然后我创建了一个解码方法:

function decode(data) {
    if (!data) return data;
    return angular.fromJson($base64.decode(data));
};

applyAnswers 方法:

function applyAnswers(groups, simpleGroups) {
    if (simpleGroups) {
        groups.forEach(function (group) {
            var simpleGroup = simpleGroups.find(function (item) {
                return item.id === group.id;
            });

            if (simpleGroup) {
                group.questions.forEach(function (question) {
                    var simpleQuestion = simpleGroup.questions.find(function (item) {
                        return item.id === question.id;
                    });

                    if (simpleQuestion) {
                        question.answer = simpleQuestion.answer;
                    }
                })
            }
        });
    }
    return true;
};

问题在于,生成的字符串是巨大的,当我刷新页面时,我得到一个错误的请求(可能是因为网址太长)。 所以,我认为最好的解决方案是加密base64字符串。所以我下载了 crypto-js ,但是当我尝试使用它时,我收到一条错误消息:

  

无效的数组长度

这是在 WordArray.clamp 方法中。

所以,我的问题是,创建一个不太长的字符串的最佳方法是什么,但是我将需要所有信息?

1 个答案:

答案 0 :(得分:0)

好吧,这不是一个URL太长的问题,这是一个问题, ui-router 状态参数试图被解析为另一个状态。 我的状态设置如下:

(function () {
    'use strict';

    angular.module('widget.wizard')
        .config(wizardRoutes);

    wizardRoutes.$inject = ['$stateProvider'];

    function wizardRoutes($stateProvider) {

        $stateProvider
            .state('category.two', configureTwoRoute());

        function configureTwoRoute() {
            return {
                url: '/two/:data',
                views: {
                    '': {
                        templateUrl: 'app/two/two.html',
                        controller: 'StepTwoController',
                        controllerAs: 'controller'
                    }
                },
                resolve: {
                    decode: ['$stateParams', 'groups', 'questionProvider', function ($stateParams, groups, questionProvider) {
                        var simpleGroups = questionProvider.decode($stateParams.data);

                        return questionProvider.applyAnswers(groups, simpleGroups);
                    }],
                    score: ['wizardService', 'groups', 'products', 'decode', function (wizardService, groups, products) {
                        return wizardService.score(groups, products);
                    }]
                },
                data: {
                    requireLogin: true,
                    pageTitle: 'Step two'
                }
            };
        };
    };
})();

但似乎与儿童国家混在一起。 我将状态声明更改为:

(function () {
    'use strict';

    angular.module('widget.wizard')
        .config(wizardRoutes);

    wizardRoutes.$inject = ['$stateProvider'];

    function wizardRoutes($stateProvider) {

        $stateProvider
            .state('category.two', configureTwoRoute());

        function configureTwoRoute() {
            return {
                url: '/two?g',
                views: {
                    '': {
                        templateUrl: 'app/two/two.html',
                        controller: 'StepTwoController',
                        controllerAs: 'controller'
                    }
                },
                resolve: {
                    decode: ['$stateParams', 'groups', 'questionProvider', function ($stateParams, groups, questionProvider) {
                        var simpleGroups = questionProvider.decode($stateParams.g);

                        return questionProvider.applyAnswers(groups, simpleGroups);
                    }],
                    score: ['wizardService', 'groups', 'products', 'decode', function (wizardService, groups, products) {
                        return wizardService.score(groups, products);
                    }]
                },
                data: {
                    requireLogin: true,
                    pageTitle: 'Step two'
                }
            };
        };
    };
})();

现在工作正常。