DurandalJS Routing Behavior

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:

  1. Je n'obtiens pas la page d'erreur, ou toute erreur (comme je pense que je devrais, par my handleInvalidRoute)
  2. Si je clique sur autre chose, l'url ne change pas et le nouveau contenu n'est pas chargé, encore une fois sans erreur.

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:

Entrez la description de l'image ici

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?)