4

私が持っているもの

何が起こっているのかを理解し、それを制御する方法を理解しようとしています。まだ認証されていないユーザー用の「パブリック」ビューと、認証済みのユーザー用の「ホーム」ビューがあります。これが私のルート設定です:

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 は変更されず、新しいコンテンツは読み込まれず、ここでもエラーは発生しません。

どういうわけかルーティングを壊していると思いますが、どうすればよいかわかりません。上記の問題を修正するにはどうすればよいですか?

画面:

ここに画像の説明を入力

4

1 に答える 1

1

なんらかの理由で、あなたがいる場所で navigateTo を呼び出すのは早すぎるのではないかと思います。この理論をテストするには、このコードを移動してみてください。

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

publicviewmodel の「アクティブ化」メソッドに追加し、main.js ではこれをそのままにしておきます。

app.setRoot('viewmodels/public');

編集:古い提案

ルートのビューモデルには、ルーター プロパティが必要だと思います。したがって、パブリック ビューモデルを変更して追加します。

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');
        };

(どこで自分自身を定義しますか?)

于 2013-04-15T02:02:56.353 に答える