Javascript 手动拒绝路由承诺';行不通

Javascript 手动拒绝路由承诺';行不通,javascript,angularjs,promise,angular-routing,Javascript,Angularjs,Promise,Angular Routing,如果条件为真,我尝试手动拒绝路由,但它似乎不起作用。我认为我并没有正确地拒绝它,但我找不到一个答案来说明如何在搜索强大的谷歌时正确地做到这一点 这是我的路线: .when('/filters/edit/:id', { name: 'filters-edit', templateUrl: './assets/angular/modules/filters/filters-edit.html', controller: 'FiltersSingleCtrl', con

如果条件为真,我尝试手动拒绝路由,但它似乎不起作用。我认为我并没有正确地拒绝它,但我找不到一个答案来说明如何在搜索强大的谷歌时正确地做到这一点

这是我的路线:

.when('/filters/edit/:id', {
    name: 'filters-edit',
    templateUrl: './assets/angular/modules/filters/filters-edit.html',
    controller: 'FiltersSingleCtrl',
    controllerAs: 'fs',
    resolve: {
        routeData: ['$q', '$route', '$location', 'utils', 'filtersApi', 'samplesApi', 'tagsApi', 'simpleCsdlData', function($q, $route, $location, utils, filtersApi, samplesApi, tagsApi, simpleCsdlData) {

            var ID = $route.current.params.id;

            var startTime = utils.getPreviousDate(30, 'yyyy-MM-dd').dateFrom + ' 00:00',
                    stopTime = utils.formatDate(utils.getDateNow(), 'yyyy-MM-dd') + ' 00:00';

            return $q.all({
                filter: filtersApi.single({id: ID}).then(function(res) {

                    res.data.versionResults[0].isAdvanced = true;

                    if (res.data.versionResults[0].isAdvanced) {

                        $location.path('/filters/edit/' + res.data.id + '/advanced');

                        $q.reject();
                    }

                    simpleCsdlData.set(res.data.versionResults[0].simpleFilterParts);
                }),
                countries: filtersApi.countries()
            });
        }]
    }
})
因此,当
res.data.versionResults[0].isAdvanced
为真时,我需要拒绝该承诺,这样视图就不会加载,现在加载,然后将用户转发到另一个页面,这不是我想要的


如何手动拒绝承诺?

我有两个建议:

  • 有一个没有模板的“RedirectController”,但有你的filtersApi调用。在
    .then()中,您可以决定下一步重定向到哪里。因此,不要导航到
    过滤器编辑
    ,而是在(“$stateChangeStart”)上的
    $rootScope.on中禁止它,并首先导航到“重定向”
  • filtersApi
    调用放在控制器内部,而不是路由中。根据我的经验,当你在顶部有一个重定向 控制器,将不显示任何内容,用户将被重定向 马上

  • 因此,你打电话的时间安排很有趣。也许您可以在更早的某个地方触发它,以便在重定向到此特定视图时得到结果,在那里检查值,然后在
    过滤器SingleController
    中重定向。看起来您正试图从成功路径中拒绝
    过滤器
    承诺(即
    。然后
    回调)。要做到这一点,您可以将原始承诺转换为另一个在所需事件中将被拒绝的承诺(这可能需要一些改进,正如我在下面代码中的评论所示):


    作业只是一个测试语句:P忘了删除它哈哈。对不起,我错过了解决部分。很好的回答,谢谢:)
    routeData: ['$q', '$route', '$location', 'utils', 'filtersApi', 'samplesApi', 'tagsApi', 'simpleCsdlData', function($q, $route, $location, utils, filtersApi, samplesApi, tagsApi, simpleCsdlData) {
        var transformPromise = function(id) {
            var deferred = $q.defer();
    
            filtersApi.single({id: id}).then(function(res) {
                res.data.versionResults[0].isAdvanced = true;
                // TODO: You probably want to rethink this boolean logic here
                // Setting a variable to true and checking whether it is true
                // immediately afterwards hardly makes much sense
                if (res.data.versionResults[0].isAdvanced) {
                    $location.path('/filters/edit/' + res.data.id + '/advanced');
                    deferred.reject();
                } else {
                    simpleCsdlData.set(res.data.versionResults[0].simpleFilterParts);
                    deferred.resolve(res.data.versionResults[0].simpleFilterParts);
                }
            }).catch(deferred.reject);
    
            return deferred.promise;
        };
    
        var ID = $route.current.params.id;
    
        // TODO: not quite sure the point of those 2 variables
        var startTime = utils.getPreviousDate(30, 'yyyy-MM-dd').dateFrom + ' 00:00',
            stopTime = utils.formatDate(utils.getDateNow(), 'yyyy-MM-dd') + ' 00:00';
    
        return $q.all({
            filter: transformPromise(ID),
            countries: filtersApi.countries()
        }
    }];