Ce que j'ai
Essayer de comprendre ce qui se passe et comment le contrôler. J'ai une vue «publique» pour les utilisateurs qui n'ont pas encore été authentifiés et une vue «à la maison» pour les utilisateurs authentifiés. Voici ma configuration d'itinéraire:
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'); }; });
Les problèmes
Lorsque je lance l'application pour la première fois, je ne suis pas authentifié et j'ai une erreur:
Uncaught TypeError: Cannot call method 'lookupRoute' of undefined
Originaire du 'router.navigateTo('#/public');'
ligne.
Ensuite, lorsque j'essaie de cliquer sur le bouton de connexion, j'ai la même erreur:
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'); };
Mais le contenu se charge correctement. Lorsque je navigue vers une page particulière en cliquant sur, dites à / dossier / 2, puis modifiez l'URL dans / dossiers / 2 (invalide), je reçois "route non trouvée" dans mon journal, comme prévu, mais je me suis retrouvé dans un Quelques autres problèmes:
Je pense que je rompe le routage de quelque façon, mais je ne sais pas comment. Comment puis-je corriger les problèmes ci-dessus?
Écran:
Je soupçonne d'appeler navigateTo où vous êtes peut-être trop tôt pour une raison quelconque. Pour tester cette théorie, essayez de déplacer ce code.
if (dataservice.isAuthenticated() === true) { app.setRoot('viewmodels/shell', 'entrance'); router.navigateTo('home'); } else { app.setRoot('viewmodels/public'); router.navigateTo('#/public'); }
Dans une méthode "activer" sur votre modèle publicview, et dans le main.js, laissez ceci:
app.setRoot('viewmodels/public');
EDIT: Old suggestion
Je crois que sur votre modèle de vue pour la racine, vous avez besoin d'une propriété de routeur. Modifiez donc votre modèle de vision public pour en ajouter un:
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'); };
(Où vous définissez-vous soi même?)