1

我已经阅读了Durandal 登录页面重定向模式,哇,有很多代码可以做我认为非常简单的事情。

我还阅读了https://groups.google.com/forum/#!topic/durandaljs/RdGpwIm1oOU,因为我希望登录页面有一个带有登录表单的简单徽标,但我也想路由用于注册和关于页面。我网站的其余部分将有一个菜单、标题等,在用户登录之前我不想显示它们。此外,我不确定当用户登录时这种方法将如何更新。

另一个几乎可以完成我想做的代码示例:https ://github.com/Useful-Software-Solutions-Ltd/Durandal451/blob/master/Durandal451v2/App/global/session.js

所以我该怎么做?有没有官方的方法可以做到这一点?人们尝试过的东西似乎混杂在一起。我认为这将是一个非常普遍的事件,但在主要文档中找不到任何内容。

4

1 回答 1

1

我不确定这是最简单的方法,但这就是我得到的

触发 app.start() 后,您需要添加一些额外的功能。

main.js

var auth = require('authentication'); // Authentication module

app.start().then(function()
{
   // This function will wait for the promise
   auth.init().then(function(data)
   {
      // When successfully authenticate, set the root to shell 
      app.setRoot('views/shell');
   }
});

身份验证.js

define(function(require)
{
  var app = require('durandal/app');

  return {
     init: function()
     {
        // Initialize authentication...

        return system.defer(function(dfd)
        {
            // Check if user is authenticate or if there has stored token
            var isAuthenticate = someOtherFunctiontoCheck();

            if (isAuthenticate)
            {
               dfd.resolve(true); // return promise
            }
            else
            {
               // When not authenticate, set root to login page
               app.setRoot('views/login');
            }
        }
     }
  };
});

祝你好运!:)

更新

登录.js

define(function(require)
{
   var ko = require('knockout');
   var auth = require('authentication');   

   var username = ko.observable();
   var password = ko.observable();

   return {
      username: username,
      password: password,
      submitForm: function()
      {
         // Do a login, if success, auth module will take care of it
         // and here will take of the error 
         auth.login(username(), password()).error(function()
         {
             // notify user about the error (e.g invalid credentials)
         });
      }
   };
});

身份验证.js

define(function(require)
{
  var app = require('durandal/app');

  return {
     init: function()
     {
        // Initialize authentication...

        return system.defer(function(dfd)
        {
            // Check if user is authenticate or if there has stored token
            var isAuthenticate = someOtherFunctiontoCheck();

            if (isAuthenticate)
            {
               dfd.resolve(true); // return promise
            }
            else
            {
               // When not authenticate, set root to login page
               app.setRoot('views/login');
            }
        }
     },
     login: function(username, password)
     {
        // do authenticate for login credentials (e.g for retrieve auth token)
        return $.ajax({
            url  : 'api/login',
            type : 'POST',
            data : {
               username: username,
               password: password
            }
        }).then(function(token){
            // on success, stored token and set root to shell
            functionToStoreToken(token);

            // Set root to shell
            app.setRoot('views/shell');
        });
     }
  };
});
于 2014-09-05T02:37:46.920 回答