[英]Redirect from within Angular controller if condition is met at start of page
我有一个用于跟踪用户工作时间的Angular应用程序。 用户添加新作业时,将通过向导进行操作,每个页面/控制器将新属性添加到作业对象。 向导完成后,用户可以通过从应用程序主页导航到作业主页来开始跟踪。
但是,可以在完成向导之前退出向导(通过“后退”按钮),然后导航到作业的主页。 我需要的是该主页的控制器重定向到缺少任何作业属性的相应向导页面。
在控制器代码开始时从本地存储中检索作业变量。
var job = DatastoreService.objectJob();
job.initFromHash($routeParams.jobHash);
function checkJobProps(prop, route){
if(!job.data.hasOwnProperty(prop))
$location.path('/wizard/add-position/' + $routeParams.jobHash + '/' + route);
}
checkJobProps('taxSettings', 'tax');
checkJobProps('payrollSettings','payroll-opt');
checkJobProps('breaks', 'breaks');
checkJobProps('allowances', 'allowances');
checkJobProps('deductions', 'deductions');
checkJobProps('generalSettings', 'general-settings');
如果某些属性不可用,则控制器上此代码下方将中断。 这些函数调用中没有一个执行得足够快以防止错误。 它们将重定向,但并不优雅,并且也将始终是列表中生效的最后一个。
我这样做有希望吗? 从应用程序的主页到每个作业的主页的导航是一个指令,因此,我想可能可以从$ routeParams.jobhash初始化作业并检查指令中的这些属性,但是我首先必须更多地了解指令。
任何帮助将非常感激。
$location.path()
是异步的,不会阻止其后面的代码执行。 您将必须使用return语句手动停止执行。
请注意,return语句必须属于控制器功能块。 您不能将其放在另一个函数中,因为那样只会停止执行该特定函数。
遵循以下原则应该可以:
var job = DatastoreService.objectJob();
job.initFromHash($routeParams.jobHash);
var redirectPath;
function checkJobProps(prop, route) {
if (redirectPath || job.data.hasOwnProperty(prop)) return;
redirectPath = '/wizard/add-position/' + $routeParams.jobHash + '/' + route;
}
checkJobProps('taxSettings', 'tax');
checkJobProps('payrollSettings', 'payroll-opt');
checkJobProps('breaks', 'breaks');
checkJobProps('allowances', 'allowances');
checkJobProps('deductions', 'deductions');
checkJobProps('generalSettings', 'general-settings');
if (redirectPath) return $location.path(redirectPath);
... rest of the code ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.