在John Papa的HotTowel SPA模板中设置导航模板的方式是,在shell.js中传递给Durandal的activate方法是单行(见下文)。这是我不知道的一些Javascript模式吗?不仅包括激活自身的启动代码背后的原因是什么?
var shell = {
activate: activate,
router: router
};
return shell;
//#region Internal Methods
function activate() {
return boot();
}
function boot() {
log('HotTowel Loaded!', null, true);
router.on('router:route:not-found', function (fragment) {
logError('No Route Found', fragment, true);
});
var routes = ...
答案 0 :(得分:2)
在您的代码示例中,boot
是一个匿名函数,在activate
方法中调用之前不会对其进行求值。在检查canActivate方法后,Durandal调用activate方法。这是视图模型的任何初始化代码都可以进行的(加载数据,枚举或引导)
上述代码的作者可能决定,为了演示如何使用激活,最好从那里调用匿名函数。
示例强>
例如,让我们添加一些激烈的console.log'来让用户确切知道发生了什么
define([], function () {
var shell = {
activate: activate,
router: router
};
return shell;
//#region Internal Methods
function activate() {
var user = showUserName();
initializeVM(user);
return boot();
}
function showUserName() {
var thisUser = 'You';
log('User is + thisUser +'!', null, true);
return thisUser;
}
function initializeVM(user) {
log('Initializing ' + user + '!', null, true);
}
function boot() {
log('HotTowel Loaded!', null, true);
router.on('router:route:not-found', function (fragment) {
logError('No Route Found', fragment, true);
});
}
});
显然,我们实际上并没有对这些功能做任何事情,但理解它们要强调的是我们所追求的。假设我们想要获取用户,然后使用该用户初始化视图模型,然后实际启动我们的应用程序以显示第一条路线,这是我们可以做到的一种方式。通过将函数(方法)分离为他们自己的匿名函数,您可以完成一些事情 -
相反且更丑陋的代码是这样的 -
define([], function () {
var shell = {
activate: activate,
router: router
};
return shell;
//#region Internal Methods
function activate() {
var thisUser = 'You';
log('User is + thisUser +'!', null, true);
log('Initializing ' + user + '!', null, true);
log('HotTowel Loaded!', null, true);
router.on('router:route:not-found', function (fragment) {
logError('No Route Found', fragment, true);
});
}
});
现在上面的函数中没有大量代码,但想象一下,如果每行有10行代码 - 它会很快变得混乱。
因此,要回答您的问题,它不一定是JavaScript特定的模式,在组织代码时这只是一种更好的做法。如果您按照作者放在一起的一些PluralSight教程,他经常将其称为模块化代码(ravoli)与成束代码(意大利面条)