Durandal 路由 IF 语句

Posted

技术标签:

【中文标题】Durandal 路由 IF 语句【英文标题】:Durandal routing IF statement 【发布时间】:2018-04-19 20:52:42 【问题描述】:

我的 shell.js 文件中的按钮上有一个点击绑定。点击带您返回

function goBack() 
return router.navigateBack();

我有一个特定的路线(reportForm),我不希望它复制这种确切的行为。我正在尝试在返回之前引入确认消息。

    function goBack() 

        if (router.routes[7].moduleId === "viewmodels/reportForm") 
            return router.navigateBack();
         else 
            return app.showMessage(strings.logoutWarning, strings.logout, [strings.no, strings.yes])
                .then(function (answer) 
                    if (answer === strings.yes) 
                        return router.navigateBack();
                    
                )
        
    

看起来它不知道当前的路线。我需要找出我当前的位置,看看是否匹配。它当前检查是否存在它总是返回相同的语句。如果有 Durandal 经验的人可以帮助我实现上述目标,我将不胜感激。

这是我的 Durandal 路由器地图(我要显示此消息的报告表单):

function activate() 
    router.map([
         route: '', title: 'Welcome', moduleId: 'viewmodels/login', nav: true ,
         route: 'home', moduleId: 'viewmodels/home', nav: true ,
         route: 'log', moduleId: 'viewmodels/log', nav: true ,
         route: 'locationSelect', moduleId: 'viewmodels/locationSelect', nav: true ,
         route: 'history', moduleId: 'viewmodels/history', nav: true ,
         route: 'helpText', moduleId: 'viewmodels/helpText', nav: true ,
         route: 'scheduled', moduleId: 'viewmodels/scheduled', nav: true ,
         route: 'reportForm/:formId(/:templateId)', moduleId: 'viewmodels/reportForm', nav: true 
    ]).buildNavigationModel();

    return router.activate();

【问题讨论】:

【参考方案1】:

您可以检查router.activeInstruction().params[0] 值,它会为您提供您将要导航到的路线。在您的canDeactivate(或您正在处理的任何其他地方)生命周期回调中,您可以将您的逻辑向用户显示确认消息,然后进行相应的导航。以下是您可以尝试的方法 -

function goBack()     
        if (router.activeInstruction().params[0] !== null && typeof(router.activeInstruction().params[0]) !== "undefined" && router.activeInstruction().params[0].indexOf("reportForm") >= 0) 
            return router.navigateBack();
         else 
            return app.showMessage(strings.logoutWarning, strings.logout, [strings.no, strings.yes])
                .then(function (answer) 
                    if (answer === strings.yes) 
                        return router.navigateBack();
                    
                )
        
    

希望这会有所帮助。

【讨论】:

谢谢@gkb。最后我确实使用 'if (router.activeInstruction().fragment.match(/^reportForm.*$/)) ' 弄清楚了,所以我猜如果我及时看到上面的内容会对我有所帮助。 activeInstruction 是我不知道的东西 @TomRudge - 是的,即使我在使用它时在文档中也找不到它......调试路由器对象也为我解决了类似的问题......

以上是关于Durandal 路由 IF 语句的主要内容,如果未能解决你的问题,请参考以下文章

Durandal - 激活 DOM 后运行 datePicker

Durandal 作文 foreach

淘汰 Durandal 撰写视图 $root 访问权限

Durandal:在一个孩子中创建功能并从另一个孩子中消费

如何使 jQuery AutoComplete 功能在 Durandal 中工作?

Karma + Jasmine + Durandal + KnockoutJS + RequireJS 单元测试中不匹配的匿名 define() 模块