Durandal:如何缓存调用?
Durandal: how to cache calls?
在我的 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
方法中我需要 return 一个承诺。我怎样才能做到这一点?
可以使用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];
}
}
});
如果您 return 为真,导航将继续!如果是字符串 returned,durandal 将导航到它!
缓存按您定义的方式工作(检查 javascript memoization)
关于 durandal Auth chech this gitHub 以获取灵感。
在我的 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
方法中我需要 return 一个承诺。我怎样才能做到这一点?
可以使用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];
}
}
});
如果您 return 为真,导航将继续!如果是字符串 returned,durandal 将导航到它!
缓存按您定义的方式工作(检查 javascript memoization)
关于 durandal Auth chech this gitHub 以获取灵感。