为什么在解析路由器之前完成了角度解析模板?

时间:2015-08-09 11:47:17

标签: javascript angularjs ngroute

我使用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;
            }]
        }
    })

但这仍然意味着仍在解析控制器/模板,这似乎不是所需/记录的行为,并且可能触发其他问题......这有充分的理由吗?

1 个答案:

答案 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();
            }]
相关问题