1

Symfony アプリケーションの jquery と ajax では、ボタンのクリックはエンティティのいくつかのプロパティを取得することを目的としています。ボタンを最初にクリックすると undefined が返されます。さらにクリックすると、期待値が取得されます。初めて手に入れる方法は?

スクリプト スニペット:

    $("#contact_household_button").click(function() {
        var houseId = $("#contact_household").val();
        if (houseId !== "") {
            var url = "/app_dev.php/household/contact/" + houseId;
            $.get(url, function(data) {
                $("#household_store").data(data);
            })
            var household = $("#household_store");
            var head = household.data('head');
            alert(houseId + ": " + head);
        }
    });

get() によって提供されるサンプル応答:

{"id":8607,"head":"誰か"}

最初のクリック収益

8607: 未定義

2 - n 回のクリックで得られる

8607 : 誰か

4

1 に答える 1

1

$.get非同期です。

つまり、そのコールバック関数は、リクエストがレスポンスを正常にフェッチしたときに、将来いつか実行されます。呼び出しの下のコード$.getは同期的に実行され、非同期操作が完了するのを待ちません。

非同期的に取得されたデータに依存するコードは、コールバック$.get内から実行/呼び出す必要があります。$.get

        $.get(url, function(data) {
            $("#household_store").data(data);
            //got response, now you can work with it
            var household = $("#household_store");
            var head = household.data('head');
            alert(houseId + ": " + head);
        });

$.Deferred必要に応じて、互換性のあるjqXHRメソッドを使用してコールバックをアタッチすることもできます。

        $.get(url).done(function(data) {
            $("#household_store").data(data);
            //got response, now you can work with it
            var household = $("#household_store");
            var head = household.data('head');
            alert(houseId + ": " + head);
        });

機能するために「2回のクリック」が必要な理由をすでに理解していると思いますが、投稿されたコードの実行フローは次のとおりです(同期ブロックを示す段落、Ajaxリクエストの開始/終了のインデント):

>>> ボタンをクリック
    >>> Ajax リクエストを送信
>>> 応答がまだ受信されていないため未定義のアラート

    >>>数ミリ秒後にAjax 呼び出しからの応答を受け取り、要素データを設定します

>>> ボタンをもう一度クリック
    >>> Ajax リクエストを再度送信
>>> 前のリクエストのデータセットを使用

    >>>後でリクエストからデータを受け取り、要素データを設定します

于 2013-09-08T00:32:27.880 に答える