我使用angular和ng-route,如果某个给定的resolve返回false,则想要处理一个简单的重定向。但是,如果路径的模板包含ng-bind-html,则表示错误:[$ sce:unsafe]尝试在安全的上下文中使用不安全的值。"即使在解析之前没有理由加载模板,也会触发错误。我发现的唯一解决方案是从解决方案中返回null(false does not work)...
https://jsfiddle.net/pansay/wLkxkp5e/3/
.when('/abc/:id', {
template: 'should not get here <span ng-bind-html="ctrl.someData"></span>', // if :id was not found
controller: ['someData', function (someData) {
this.someData = someData;
}],
controllerAs: 'ctrl',
resolve: {
someData: ['$location', function ($location) {
// actual case: use the :id param to fetch data from some service
// but redirect if it returns false
$location.path('/abc');
return false;
}]
}
})
但这仍然意味着仍在解析控制器/模板,这似乎不是所需/记录的行为,并且可能触发其他问题......这有充分的理由吗?
答案 0 :(得分:1)
当您从解决方案返回false
时,实际上表明解析很好并且返回值false
将传递给范围。所以它进入那个状态之前暂时重定向,值为false。由于使用奇怪的数据解析someData
,您会看到异常等。
您需要做的是阻止进入该状态,如果您要进行重定向。要做到这一点,你需要返回一个承诺并拒绝承诺。
像这样:
someData: ['$location', '$q', function ($location, $q) {
return fetchFromSomeService.then(
function(valueFromService) {
if(valueFromService === false) {
return $q.reject();
}
return valueFromService;
}
}]
对于您的代码示例,您只需执行此操作即可:
someData: ['$location', '$q', function ($location, $q) {
// actual case: use the :id param to fetch data from some service
// but redirect if it returns false
return $q.reject();
}]