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;
        };
    }

私が確信していない唯一のことは、この関数を何度も呼び出すと、このオブジェクトを作成し続けるのか、それともライブが既にバインドされていて、それ以上バインドしないことを確認するのかということです。

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に表示されているため、他のモジュールで表示されますmymy.events()そのように返しcreateSubmitFrmHandlerて参照することができます。セレクターがコストのかかるものでない場合は、単純に の値をcreateSubmitFrmHandler再度計算して$(my.selectors.createFrm).validate().form();、 を参照する代わりにダイアログ モジュールで使用できますcreateSubmitFrmHandler。あなたに合ったものは何でも。

于 2011-02-28T22:50:37.280 に答える