如果在页面开始时满足条件,则从Angular控制器内重定向

时间:2015-11-07 07:37:29

标签: javascript angularjs

我有一个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初始化作业并在指令中检查这些属性,但是我必须首先了解更多有关指令的信息。

非常感谢任何帮助。

1 个答案:

答案 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 ...