私が持っているもの
何が起こっているのかを理解し、それを制御する方法を理解しようとしています。まだ認証されていないユーザー用の「パブリック」ビューと、認証済みのユーザー用の「ホーム」ビューがあります。これが私のルート設定です:
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 (無効) に変更すると、予想どおり、ログに「ルートが見つかりません」と表示されますが、その他のいくつかの問題:
- エラーページやエラーが表示されません(handleInvalidRouteごとに、そうすべきだと思います)
- 他の何かをクリックしても、URL は変更されず、新しいコンテンツは読み込まれず、ここでもエラーは発生しません。
どういうわけかルーティングを壊していると思いますが、どうすればよいかわかりません。上記の問題を修正するにはどうすればよいですか?
画面: