gpt4 book ai didi

javascript - DurandalJS 路由行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:34:46 25 4
gpt4 key购买 nike

我有什么

试图了解正在发生的事情以及如何控制它。对于尚未通过身份验证的用户,我有一个“公共(public)” View ,对于已通过身份验证的用户,我有一个“主页” View 。这是我的路线配置:

app.start().then(function() {
//Replace 'viewmodels' in the moduleId with 'views' to locate the view.
//Look for partial views in a 'views' folder in the root.
viewLocator.useConvention();

//configure routing
router.useConvention();

router.mapRoute('home', 'viewmodels/home', 'Test App', true);
router.mapRoute('public', 'viewmodels/public', 'Test App', true);
router.mapRoute('set/:id', 'viewmodels/set', 'Set');
router.mapRoute('folder/:id', 'viewmodels/folder', 'Folder');
router.mapRoute('api', 'viewmodels/api', 'API Reference');
router.mapRoute('error', 'viewmodels/error', 'Error', false);
app.adaptToDevice();

//Show the app by setting the root view model for our application with a transition.

if (dataservice.isAuthenticated() === true) {
app.setRoot('viewmodels/shell', 'entrance');
router.navigateTo('home');
} else {
app.setRoot('viewmodels/public');
router.navigateTo('#/public');
}

router.handleInvalidRoute = function (route, params) {
logger.logError('No route found', route, 'main', true);
router.navigateTo('#/error');
};
});

问题

当我第一次运行应用程序时,我没有通过身份验证,并且出现错误:

Uncaught TypeError: Cannot call method 'lookupRoute' of undefined 

源自 'router.navigateTo('#/public');' 行。

然后当我尝试点击登录按钮时,我得到了同样的错误:

define(['durandal/app', 'durandal/plugins/router', 'services/dataservice'], function (app, router, dataservice) {
var publicViewModel = function () {
self.logIn = function () {
app.setRoot('viewmodels/shell');
router.navigateTo('#/home');
};

但内容加载正确。当我通过单击导航到特定页面时,说到/folder/2,然后将 url 更改为/folders/2(无效),我的日志中出现“找不到路由”,正如预期的那样,但我遇到了其他几个问题:

  1. 我没有收到错误页面或任何错误(根据我的 handleInvalidRoute,我认为我应该这样做)
  2. 如果我点击其他内容,url 不会改变,也不会加载新内容,同样没有错误。

我想我以某种方式破坏了路由,但我不确定如何破坏。我该如何纠正上述问题?

屏幕:

enter image description here

最佳答案

我怀疑出于某种原因调用 navigateTo 可能为时过早。要测试这个理论,请尝试移动此代码。

    if (dataservice.isAuthenticated() === true) {
app.setRoot('viewmodels/shell', 'entrance');
router.navigateTo('home');
} else {
app.setRoot('viewmodels/public');
router.navigateTo('#/public');
}

进入你的 publicviewmodel 的“activate”方法,在 main.js 中只留下这个:

app.setRoot('viewmodels/public');

编辑:旧建议

我相信您的 Root View 模型需要一个路由器属性。因此,修改您的公共(public) View 模型以添加一个:

define(['durandal/app', 'durandal/plugins/router', 'services/dataservice'], function (app, router, dataservice) {
var publicViewModel = function () {
self.router = router;
self.logIn = function () {
app.setRoot('viewmodels/shell');
router.navigateTo('#/home');
};

(你在哪里定义 self ?)

关于javascript - DurandalJS 路由行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16006405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com