手动拒绝路由承诺不起作用
Manually reject route promise doesn't work
我正在尝试在条件为真时手动拒绝路由,但它似乎不起作用。我想我没有正确地拒绝它,但是当我搜索强大的 Google 时,我找不到显示如何正确执行此操作的答案。
这是我的路线:
.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
为真时,我需要拒绝承诺,以便视图根本不会加载,现在它加载,然后将用户转发到另一个页面,这不是我想要的。
如何手动拒绝承诺?
我有两个建议:
- Have a "RedirectController" with no template, but your filtersApi call. Inside the
.then()
you can decide where to redirect next. So instead of navigating to filters-edit
, forbid it inside the $rootScope.on('$stateChangeStart')
and navigate to "redirect" first.
- Put the
filtersApi
call inside the controller instead of the route. In my experience when you have a redirect at the top of the
controller, nothing will be shown and the user gets redirected
immediately.
因此,您来电的时机很有意思。也许你可以在更早的地方触发它,当你重定向到这个特定的视图时得到结果,检查那里的值,然后在 FiltersSingleController
.
中重定向
您似乎正试图从成功路径(.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()
}
}];
我正在尝试在条件为真时手动拒绝路由,但它似乎不起作用。我想我没有正确地拒绝它,但是当我搜索强大的 Google 时,我找不到显示如何正确执行此操作的答案。
这是我的路线:
.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
为真时,我需要拒绝承诺,以便视图根本不会加载,现在它加载,然后将用户转发到另一个页面,这不是我想要的。
如何手动拒绝承诺?
我有两个建议:
- Have a "RedirectController" with no template, but your filtersApi call. Inside the
.then()
you can decide where to redirect next. So instead of navigating tofilters-edit
, forbid it inside the$rootScope.on('$stateChangeStart')
and navigate to "redirect" first.- Put the
filtersApi
call inside the controller instead of the route. In my experience when you have a redirect at the top of the controller, nothing will be shown and the user gets redirected immediately.
因此,您来电的时机很有意思。也许你可以在更早的地方触发它,当你重定向到这个特定的视图时得到结果,检查那里的值,然后在 FiltersSingleController
.
您似乎正试图从成功路径(.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()
}
}];