我正在努力为我遇到的问题找到合适的解决方案。 基本上我有一组可以跨视图回答的问题。我希望这样我可以复制网址并将其粘贴给另一个人,他们将得到我所拥有的确切问题和答案。 我不想使用大量的查询参数,所以我决定使用我的问题对象,然后在运行中对其进行解码,这听起来像是一个好的计划。
所以我用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 方法中。
所以,我的问题是,创建一个不太长的字符串的最佳方法是什么,但是我将需要所有信息?
答案 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'
}
};
};
};
})();
现在工作正常。