为什么HotTowel SPA模板中有单独的激活和启动功能?

时间:2013-12-27 18:53:05

标签: javascript durandal hottowel

在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 = ...

1 个答案:

答案 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);
        });
    }
});

显然,我们实际上并没有对这些功能做任何事情,但理解它们要强调的是我们所追求的。假设我们想要获取用户,然后使用该用户初始化视图模型,然后实际启动我们的应用程序以显示第一条路线,这是我们可以做到的一种方式。通过将函数(方法)分离为他们自己的匿名函数,您可以完成一些事情 -

  1. 分开关注点 - 该函数只执行它所需的一小部分,而不是拥有一个包含所有代码的大型函数。
  2. 允许代码组织作为您的应用程序扩展 - 您可以轻松地将这些功能移动到一个模块中,该模块用于处理分离出来的内容,尤其是使用Durandal和require.js
  3. 您可以更进一步,实际上有数据调用返回一个承诺,以防止应用程序启动,直到身份验证或发生了某些事情。
  4. 相反且更丑陋的代码是这样的 -

    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)与成束代码(意大利面条)