我的 Durandal 应用程序在 shell.js 中的启动逻辑需要根据某些条件逻辑将用户发送到两个可能的视图之一。基本上,如果以前没有选择某些选项,我会将它们发送到设置页面,否则我会将它们发送到正常的起始页面。
以前,在 Durandal 1.x 中,我只在调用激活时传递一个指示起始模块的字符串。但在 Durandal 2.x 中已被弃用。
所以首先,我想知道从路由数组的角度来看,推荐的方法是什么?我是否应该只注册两个路由,就好像启动模块都不是(如下所示)然后有条件地将另一个路由添加到默认路由''的数组?
{ route: "setup", moduleId: "setup", title: "Setup", nav: false },
{ route: "Students", moduleId: "students", title: "Students", nav: false }
我的问题的第二部分涉及如何处理调用 Web 服务的需要,这是我确定哪个模块是启动模块的条件逻辑的一部分。我的启动逻辑涉及检查浏览器的本地存储,但有时我还需要向服务器发出 ajax 请求以获取一些信息。
我的理解是 router.activate() 是一个承诺。我真的可以创建自己的承诺并在 ajax 调用完成后通过调用 router.activate() 来解决它吗?还是我需要另一种方法来处理它?我认为我可能会如何处理此问题的示例代码:
var deferred = $.Deferred();
//Setup and conditional logic here
var routes = setupRoutes();
$.get('/api/myStartupEndpoint')
.done(function(results) {
//check results and maybe alter routes
deferred.resolve(router.map(routes).activate());
});
return deferred.promise();
那有意义吗?我仍在将我的应用程序转换为 Durandal 2.0.1,所以我还不能尝试这个,但不管它是否可以,我都想知道在这种情况下推荐的方法是什么。