【问题标题】:Durandal - hide section of page depending on url or routeDurandal - 根据 url 或路由隐藏页面部分
【发布时间】:2015-02-26 03:35:57
【问题描述】:

在我的 durandal 应用程序中,除主页外的每个页面都有一个左侧导航栏。这个左侧导航栏应该在刷新时更新,尽管它应该驻留在 shell.html 上。

问题是我无法在主页上正确隐藏它。当我在主页上时,我可以使用 jquery hide() 方法隐藏 leftnav div,但问题是我只能在 data-bindind 之后使用 jquery 代码,直到那里我可以看到导航栏。我尝试使用 durandal 组合,但我不确定如何仅在主页中隐藏导航栏,因为我不知道如何知道我是否在主页上或不在 shell.js 中。

有什么想法吗?

【问题讨论】:

    标签: javascript jquery durandal durandal-2.0


    【解决方案1】:

    在您的视图模型中,您需要通过创建一个侦听当前指令值的计算来连接到您的路由器:

    var ko = require('knockout');
    var router = require('plugins/router');
    
    function viewModel() {
        this.currentRoute = ko.computed(function() {
            return router.activeInstruction().fragment;
        });
    }
    

    然后您可以使用视图中的可见绑定来引用此变量。

    <!-- home route only -->
    <div data-bind="visible: currentRoute() == 'home'></div>
    
    <!-- non-home routes -->
    <div data-bind="visible: currentRoute() != 'home'></div>
    

    如果您需要更复杂的逻辑,您可以创建一个特殊的计算函数,对当前路由进行特定测试并引用该变量。例如:

    this.isSpecialRoute = ko.computed(function() {
        var re = /matchspecialroute/;
        return re.test(this.currentRoute());
    }, this);
    

    【讨论】:

    • 如果这个答案对你有用,请不要忘记接受并投票!!
    • 我只需要稍微修改一下代码:仅当 router.aciveInstruction() 不为空(只是一个 if 条件)时才返回 router.activeInstruction().fragment 谢谢!
    • @MatthewJamesDavis 很好的答案!但请确保您在 viewModel 的 detached 处理程序中处理您的计算。否则,你会在这里像筛子一样漏水。更好的是,如果您已升级到最新版本的 KnockoutJS,则可以使用 pureComputed observable,因为作为答案的一部分提供的计算中没有副作用。
    • 再注意一点:如果您的“home”视图是您的根,那么您应该将 currentRoute() 与“”(空字符串)而不是“home”进行比较
    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    相关资源
    最近更新 更多