我有单页 Web 应用程序是在主干js 上编写的。我使用不同的路线,每条路线对应一个控制器。当我加载我的应用程序根 URL (myapp.com/) 或任何没有参数的非根 URL (myapp.com/somelocation) 时,它可以正常工作。但是,当我尝试使用查询参数(即 myapp.com/somelocation?z=search)将我的应用程序直接加载到任何位置时,我遇到了一些麻烦。应用程序呈现两次 - 第一次使用对应于 myapp.com/somelocation?z=search 的正确控制器,第二次使用对应于 myapp.com/somelocation 的控制器。
路由表如下所示:
routes: {
'login': 'login',
'home': 'home',
'timeline?*query': 'timelineWithQuery',
'timeline': 'timeline',
...
'*path': 'defaultRoute'
}, ...
控制器如下所示:
defaultRoute: function() {
router.navigate('home', {trigger: true});
},
login: function(args) {
var controller = new App.PageController.Mobile.AuthPageController($('body'));
controller.executeLogin(args);
},
timeline: function(args) {
var controller = new App.PageController.Mobile.TimelinePageController($('body'));
controller.executeTimeline(args);
}, ...
Document.ready 脚本如下所示:
// ...
router.navigate(window.location, {trigger: true});
// ...
如果我不调用 router.navigate(window.location, {trigger: true}); 明确地没有一个控制器呈现我的应用程序起始页。当我调用它时,应用程序正常工作,直到我尝试从 myapp.com/timeline?foo=bar URL 开始。如果我这样做,我的应用程序会呈现两次(无需重新加载页面)。
有什么建议么?对于具有丰富路由场景的主干js驱动的单页应用程序,常见的 document.ready 引导模式是什么?