Javascript自包含沙箱事件和客户端堆栈

Amn*_*non 8 javascript jsf client-side javascript-events

我正在将JSF重型Web应用程序移动到REST并主要是JS模块应用程序.

我已经看过Nicholas Zakas在YUI影院播放的"可扩展的javascript应用程序架构"(精彩视频),我实施了大部分演讲并取得了很大的成功,但我有一些问题:

  1. 我发现这个讲座在模块和沙箱之间的关系方面有点混乱,一方面,根据我的理解,模块不应该受到沙盒之外发生的事情的影响,这就是他们通过沙箱发布事件的原因(而不是通过核心,因为核心是用于隐藏基础库)但应用程序中的每个模块都有一个新的沙箱?沙盒是否应该将事件限制为使用它的modoules,还是应该跨页面发布事件?例如:如果我有两个可编辑的表,但我想在不同的沙箱中包含每个表,并且它的事件只影响该沙箱中的模块,比如每个表的消息框,这是一个不同的模块/小部件,我该怎么做呢每个模块的沙箱,

  2. 虽然我可以隐藏基本库的小东西,如id选择器等.我仍然希望使用基础库的模块依赖和资源加载,并使用像YUI加载器或dojo.require之类的东西,所以实际上我隐藏了基础库但模块本身是由基础库定义和加载的......对我来说似乎有点奇怪.

  3. 库不会返回简单的js对象,但通常会将它们包装起来:例如:你可以做一些类似于$$('.classname')的东西.每个(...清理代码很多,包装底部然后在该模块通过执行.each为基础库创建依赖关系,但不使用这些功能会导致编写大量代码,而这些代码可能会被遗漏......并且实现该功能非常容易出错.

  4. 有没有人有建立这个订单的正面堆栈的经验?使用yui数据表但使用dojo进行表单验证更改基础库和/或从不同库中获取模块有多容易?

  5. 如果你选择像我说的那样做,并且通过YUI加载器加载dojo表单验证小部件,那么2 + 4的某种组合可能意味着dojocore是一个模块而表单模块依赖于它?

谢谢.

Eli*_*Eli 3

我们在应用程序中大量使用这种模式。查看Stoyan Stefanov 所著的《JavaScript Patterns》一书,详细了解如何实现沙盒模式。基本上它看起来像这样:

(function (global) {
    var Sandbox = function fn (modules, callback) {
        var installedModules = Sandbox.modules,
            i = 0,
            len = modules.length;

        if (!(this instanceof fn)) {
            return new fn(modules, callback);
        }

        // modules is an array in this instance:
        for (; i < len; i++) {
            installedModules[modules[i]](this);
        }

        callback(this);
    };

    Sandbox.modules = {};
    global.Sandbox = Sandbox;

})(this);

// Example module:
// You extend the current sandbox instance with new functions
Sandbox.modules.ajax = function(sandbox) {
    sandbox.ajax = $.ajax;

    sandbox.json = $.getJSON;
};

// Example of running your code in the sandbox on some page:
Sandbox(['ajax'], function(sandbox) {

    sandbox.ajax({
        type: 'post',
        url: '/Sample/Url',
        success: function(response) {
            // success code here. remember this ajax maps back to $.ajax
        }
    });

});
Run Code Online (Sandbox Code Playgroud)