在我的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。我怎样才能做到这一点?
答案 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的灵感。