杜兰达:如何缓存电话?

时间:2015-08-21 15:45:10

标签: javascript durandal durandal-2.0

在我的durandal应用程序中,我需要知道用户是否登录了不同的地方。因此,目前我正在调用在每个需要它的视图中获取用户状态。

可以这样做:

//login.js

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

 function getLogin() {
 if (isLogged != undefined) return isLogged
 return http.get('/api/login').then(function(data) {
  isLogged = data.logged
  return isLogged
  })
 }

 return {
  getLogin: getLogin
}

//view.js
define(function(require) {
 var login = require('login')
 function vm() {
  var self = this;
  self.isLogged;
  self.activate = function() {
   self.isLogged = login.getLogin()
  }
 }
 return vm
})

上述方法不起作用,因为在视图activate方法中我需要返回一个promise。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用guardRouter功能!

这将在所有导航中触发。

// Shell main or other file that runs before any view!
// Define the router guard function!

 require('plugin/router', 'Q', function(router, q){

     var cache = {};

     router.guardRoute = function(instance, instruction) {
         var key = instruction.fragment.toLowerCase();

         return cache[key] !== undefined ?
             cache[key]:
             q($.get(url,data)).then(_setCache, _fail);


         function _fail(/*jqhxr*/) {
            /* do something */
         }

         function _setCache(result) {
             cache[key] = result;
             return cache[key];
         }
     }

 });

如果您返回true,导航将继续!如果返回字符串,durandal将导航到它!

缓存在您定义时工作(检查javascript memoization

关于durandal Auth chech this gitHub的灵感。