手动拒绝路由承诺无效。

3

如果某个条件成立,我想手动拒绝一条路由,但似乎并没有起作用。我认为我没有正确地拒绝它,但是当我在强大的谷歌搜索时,找不到正确的方法。

这是我的路由:

.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为true时,我需要拒绝promise以便视图根本不加载,在现在的情况下它会先加载然后将用户转到另一个页面,这不是我想要的。

我该如何手动拒绝promise?

2个回答

2
似乎您试图在成功路径(即.then回调函数)内拒绝filter承诺。为了实现这一点,您可以将原始承诺转换为另一个在所需事件中被拒绝的承诺(可能需要根据下面代码中我的评论进行一些修改):
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()
    }
}];

这个赋值语句只是一个测试语句 :P 忘记删除了哈哈。 - Chrillewoodz
抱歉我错过了解决部分。非常好的答案,谢谢 :) - Chrillewoodz

0

我有两个建议:

  1. 创建一个“RedirectController”,没有模板,但是有你的“filtersApi”调用。在.then()中,您可以决定下一步重定向到哪里。因此,禁止在$rootScope.on('$stateChangeStart')内导航到filters-edit,并首先导航到“redirect”。
  2. filtersApi调用放在控制器中,而不是路由中。根据我的经验,当你在控制器顶部进行重定向时,什么也不会显示,用户会立即被重定向。

因此,您的调用时间很有趣。也许您可以在更早的地方触发它,以便在重定向到这个特定视图时获得结果,在那里检查值,然后在FiltersSingleController中重定向。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接