我有一个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初始化作业并在指令中检查这些属性,但是我必须首先了解更多有关指令的信息。
非常感谢任何帮助。
答案 0 :(得分:0)
$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 ...