0

以前はなかったケースがあり、実際にそれを理解できません。何が問題なのか. :(私は古い未解決のjsコードのコントローラークラスを作成しようとしましたが、もう少しオブジェクト指向にしようとしました(はい、失敗しましたが、練習も知識の母です)。だから、ここに私のコードがあります:

関数は、次のように、変数を処理してフォームをポップする Main 関数を呼び出します。

function Main(com,  multiple, grid) {
    if (CheckTableFunctions(arguments) == true)
    {
        var partner = Partner.Factory(com);
        switch(com)
        {
            case "CreatePartners":
            ...
            break;

            case "GetPartners":
            $e = ShowModal(); // <- this makes a form visible
            Communicate(com, partner, function(data) <- ajax req. with callback
                {
                ... // <- manipulate data, fill form, etc.
                });
            Main("EditPartners", multiple, grid); // <- calling Main Editpartners case
            break;

実際、GetPartners のケースは EditPartners の前にありますが、これは単にフォームに入力するためのものです。以下のように、編集、およびイベント バインディングは editpartners に送信されます。

            case "EditPartners":
            $e = GetModal(); // <- THE ERROR
            $e.find("a.submit").click(function(e){
                partner.fx_data.partner.data = getFormData($e)
                Communicate(com, partner, function(data) // <- return the modified values by ajax
                {
                    CloseModal();
                });
            });
        break;

そのため、fn GetModal を実行すると、空のオブジェクトが返されますが、関数は実行GetModal = fn(){$e=$(".poppedModal");return $e;}後に正しく機能しMain(EditP)ます。何よりも論理的または系統的なエラーだと思います。そして、本当のことを言うと、コールバックで呼び出しました。つまり、使用ShowModal(callback)したことを意味し、準備ができたら呼び出しましMain(EditP)たが、機能しませんでした。

編集:

申し訳ありませんが、主な問題を忘れていました(主な問題だと思います)。だから私はちょうどそれのhtmlプロトタイプを持っているフォームを正確に持っていません。必要なときに常にクローンを作成するため、プロトタイプを作成します。

ここに showmodal fn があります。これにより、モーダルに到達できなくなると思います。

function ShowModal()
{
    $container = $('#myModal');
    $clone = $container.clone();
    $clone.removeAttr("id").addClass("clonedModal");
    $clone.modal('show');
    return $clone;
}

function ShowModal()
{
    $container = $('#partnerModal');
    document.getElementById('partnerForm').reset();
    $container.modal('show');
    return $container;
}

ご協力いただきありがとうございます。

レパス

4

1 に答える 1

1

いくつかのポイント:

  1. javascript関数内のメンバーは、で宣言されている場合にのみローカライズされvarます。それ以外の場合は、グローバル名前空間までの「外部」メンバーです。いくつかの変数をローカライズする必要があります。宣言されていない変数は、厄介なバグを引き起こす可能性があります。
  2. .clone()実際にDOMフラグメントのクローンを作成しますが、それをDOMに自動的に不活性化することはありません。、、、など.append()のjQuery命令を使用してこれを行う必要があります。私はあなたの問題の大部分が挿入されていないクローンでやろうとしていることを強く疑っています。.prepend().before().after().modal()
  3. フォームを使用するたびにフォームのクローンを作成する必要がある理由は明らかではありません。この種のプログラミングは、メモリリークを引き起こす可能性があります。単一のフォームを再利用する方がよりクリーンで通常の方法です。以前に入力/選択した値をクリアするためにフォームをリセットすることは難しくありません。

編集:

適切にローカライズされた変数を持つShowModal:

function ShowModal() {
    var $container = $('#partnerModal');
    document.getElementById('partnerForm').reset();
    $container.modal('show');
    return $container;
}

実際、.modal()チェーン可能であるように記述されている場合はShowModal()、ローカルまたはその他の名前付きメンバーを作成しないように簡略化できます。

function ShowModal() {
    $('#partnerForm').get(0).reset();
    return $('#partnerModal').modal('show');
}

また、JavaScriptプログラミングの慣例により、コンストラクター関数のみに最初の大文字で名前を付ける必要があることに注意してください。コンストラクター関数は、で呼び出されるように設計された関数new Fn()です。(ここでは重要ではありませんが、コンストラクターの主題について多くの議論があり、一部の人はの使用を避けるためにコードを書くことを選択しますnew)。

于 2012-05-22T00:05:21.127 に答える