0

我正在尝试使用JavaScript 模块模式,但遇到了一个我不确定如何解决的问题。

所以我有 2 个脚本文件,因为我想分隔我的代码并使其更易于阅读。

// script 1

var abc = (function (my, $)
{
    my.events = function ()
   {
        // selectors is from my base file(not shown as I don't think it is needed to be shown)
        // my.selectors.createFrm = '#createFrm'
        var createSubmitFrmHandler = $(my.selectors.createFrm).live('submit', function (e)
        {
            e.preventDefault();
        });

   }

   return my;

} abc || {}, jQuery));

// script 2

var abc = (function (my, $)
{
     my.dialogs = {

        addDialog: function ()
        {
            var $dialog = $('<div></div>').dialog(
            {
                width: 580,
                height: 410,
                resizable: false,
                modal: true,
                autoOpen: false,
                title: 'Basic Dialog',
                buttons:
                    {
                        Cancel: function ()
                        {
                            $(this).dialog('close');
                        },
                        'Create': function ()
                        {

                            jQuery.validator.unobtrusive.parse(my.selectors.createFrm)
                            // this is undefined as page loadup no form was found so live did not kick in
                            my.createSubmitFrmHandler.validate().form();

                        }
                    }
            });

            return $dialog;
        },

    return my;
} abc || {}, jQuery));

所以我不确定如何确保 createSubmitFrmHandler 已定义并继续我正在做的事情。

编辑

我最终做了这样的事情

   var abc = (function (my, $)
    {
        my.events = function ()
       {
            // some one time events here
       }

        my.test = function() 
        {
            var add = $(selectors.createFrm).live('submit', function (e)
            {
                e.preventDefault();
            });

            return add;
        };
    }

我唯一不确定的是,如果我一遍又一遍地调用这个函数,它会继续生成这个对象,还是会看起来并看到 live 已经绑定并且不会再进行绑定?

4

1 回答 1

1

模块模式的要点是 Javascript 具有函数作用域:定义的变量对于定义var它们的函数是局部的。

(function() {
    var foo = 'bar';
    // foo == 'bar'
})();
// foo == undefined

由于您createSubmitFrmHandler在分配给的函数中定义,因此my.events您不能在该函数的主体之外引用它。有几种方法可以解决这个问题。传递my给所有模块的要点是它们可以通过它共享秘密:您可以my.events.handler = createSubmitFrmHandler在第一个模块中设置,并且my.events.handler将在另一个模块my中可见,因为在那里可见。您可以以这种方式my.events()返回createSubmitFrmHandler并引用它。如果选择器不是一个昂贵的选择器,您可以简单地createSubmitFrmHandler再次计算 的值,并$(my.selectors.createFrm).validate().form();在对话框模块中使用,而不是尝试引用createSubmitFrmHandler. 什么适合你。

于 2011-02-28T22:50:37.280 回答