0

我定义了多条路线。其中一条路线是我的主要路线,它在应用程序启动时加载,只有这条路线已设置nav: true;所有其他路线已设置nav: false;

在默认路由的 html 页面上,用户必须加载数据库数据。仅当加载数据库数据时,所有其他路由nav: false;都应设置为 true。

 function databaseDataLoaded() {

        for (var i = 0; i < router.routes.length; i++) {
            router.routes[i].nav = true;
        }
    }

当调用上述方法来呈现导航的超链接时,它们不会被呈现。问题是我的 router.map 函数只采用常见的对象文字而不是淘汰可观察对象吗?或者在 durandal 架构中是否有更好的方法来处理这样的场景?

4

1 回答 1

0

这个答案对于使用 Sammy.js 路由器的 Durandal 1.X 是正确的(我还没有使用 2.0 路由器来测试任何东西)

问题是,当您映射路线时,路线的属性不是可观察的。路由器获取您想要映射的路由并映射它们,当需要映射其他路由时,您也需要返回并路由它们。

例子 -

    router.map({
        url: 'home',
        moduleId: 'viewmodels/home',
        name: 'Home',
        visible: true,
        settings: {}
    });
    return router.activate('home');

并在您的数据加载后,然后加载额外的路线 -

var newRoutes = [{
    url: 'other',
    moduleId: 'viewmodels/other',
    name: 'Other',
    visible: true,
    settings: {}
}, {
    url: 'about',
    moduleId: 'viewmodels/about',
    name: 'About',
    visible: true,
    settings: {}
}];
router.map(newRoutes );

编辑

如果您担心路由的放置位置,只需在数据已加载到 config.js 时移动您要加载的所有路由,并且仅在应用启动时加载第一个路由。例子 -

外壳.js

function activate() {
    datacontext.loadData().then(loadAllRoutes);
    router.map({
        url: 'home',
        moduleId: 'viewmodels/home',
        name: 'Home',
        visible: true,
        settings: {}
    });
    return router.activate('home');
}

function loadAllRoutes() {
    var routes = config.routes;
    router.map(routes);
}

替代

如果您想隐藏/显示基于不同事件的路线,但仍要同时加载它们,只需使用您的导航栏获得更多创意。可见性切换仍设置为可见,但您可以使用类似

<ul class="nav">
    // Show home route always
    <li>Home</li>
    <!-- ko foreach: visibleRoutes -->
    <li>(Put routes here)</li>
    <!-- /ko -->
</ul>

并在你的 shell 中创建一个 observable,在数据加载完成时将 dataLoaded 从 false 更改为 true。

var dataLoaded = ko.observable(false);
function activate() {
    datacontext.loadData().then(loadAllRoutes);
    var routes = config.routes;
    router.map(routes);
    return router.activate(config.startModule);
}

function loadAllRoutes() {
    dataLoaded(true);
}
于 2013-08-04T17:43:47.807 回答