Может кто-нибудь объяснить мне кое-что об этом коде JQuery, который я здесь из учебника MVC Music Store - PullRequest
1 голос
/ 08 июля 2011

То, что меня несколько смущает, и это, вероятно, связано с соглашениями в jquery ajax () request .post (), заключается в том, что он нигде не указывает, что если запрос успешен, он должен вызвать функцию handleUpdate (), котораявозвращает возвращенный объект json с помощью «var json = context.get_data ();», а также почему весь кусок кода начинается с «if (data.ItemCount == 0)» в handleUpdate (), идентичного тому, что в.post () при успешном запуске> function (data) {duplicate code}.

Возможно, поскольку function (data) {} является функцией обратного вызова, она ожидает завершения всего цикла запрос / ответ и включает «varjson = context.get_data (); "в handleUpdate ()?

Спасибо ..

Вставлено из учебника PDF, никакой другой jscript в этом представлении.

<script type="text/javascript">
    $(function () {
        // Document.ready -> link up remove event handler
        $(".RemoveLink").click(function () {
            // Get the id from the link
            var recordToDelete = $(this).attr("data-id");
            if (recordToDelete != '')
            {
                // Perform the ajax post
                $.post("/ShoppingCart/RemoveFromCart", { "id": recordToDelete },
                function (data) {
                // Successful requests get here
                // Update the page elements
                if (data.ItemCount == 0)
                {
                    $('#row-' + data.DeleteId).fadeOut('slow');
                }
                else
                {
                    $('#item-count-' + data.DeleteId).text(data.ItemCount);
                }

                $('#cart-total').text(data.CartTotal);
                $('#update-message').text(data.Message);
                $('#cart-status').text('Cart (' + data.CartCount + ')');
                });
            }
        });
    });

    function handleUpdate()
    {
        // Load and deserialize the returned JSON data
        var json = context.get_data();
        var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);

        // Update the page elements
        if (data.ItemCount == 0)
        {
            $('#row-' + data.DeleteId).fadeOut('slow');
        }
        else
        {
            $('#item-count-' + data.DeleteId).text(data.ItemCount);
        }

        $('#cart-total').text(data.CartTotal);
        $('#update-message').text(data.Message);
        $('#cart-status').text('Cart (' + data.CartCount + ')');
    }
</script>

Ответы [ 2 ]

2 голосов
/ 09 июля 2011

Функция handleUpdate () является реликвией из предыдущей MVC2 версии учебника, где Ajax для удаления товаров из корзины обрабатывался Microsoft Ajax, вызываемой через помощник Ajax.ActionLink.(см. ниже)

Это было изменено для использования JQuery Ajax в MVC3 версии этого учебника, но код handleUpdate () был оставлен в нем, по-видимому, ошибочно при преобразовании из MVC2 вMVC3.

<script src="/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="/Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>

<script type="text/javascript">
    function handleUpdate(context) {
        // Load and deserialize the returned JSON data
        var json = context.get_data();
        var data = Sys.Serialization.JavaScriptSerializer.deserialize(json);

        // Update the page elements
        $('#row-' + data.DeleteId).fadeOut('slow');
        $('#cart-status').text('Cart (' + data.CartCount + ')');
        $('#update-message').text(data.Message);
        $('#cart-total').text(data.CartTotal);
    }
</script>

...

<%: Ajax.ActionLink("Remove from cart", "RemoveFromCart", 
         new { id = item.RecordId }, 
         new AjaxOptions { OnSuccess = "handleUpdate" })%>
0 голосов
/ 08 июля 2011

Нет способа (согласно этому коду), что handleUpdate вызывается при успехе $.post. Функция поста Jquery имеет следующий синтаксис

$.post(url,data, callback);

и в коде вы можете видеть, что все три параметра явно указаны, а обратный вызов является анонимной функцией с сигнатурой

function(data){}

Теперь вы можете видеть, что эта анонимная функция и handleUpdate выполняют абсолютно одинаковую логику. Это заставляет меня поверить, что они принадлежат к двум различным сценариям. Например, первый сценарий состоит в том, что ссылки отображаются с использованием

Html.ActionLink(LinkText, ActionName, new{@class = "RemoveLink"})

В этом случае событие click обрабатывается функцией jquery сверху, и вся логика выполняется в этой функции (включая ajax и callback). Вторая функция могла быть использована для некоторых

//please confirm all parameters of the function
Ajax.ActionLink(LinkText, ActionName, new AjaxOptions{onSuccess = "handleUpdate"});

и это, похоже, связано с файлами microsoftmvc ajax, которые существовали в древние времена. Вы можете поставить оповещение в каждой функции и проверить, что происходит с вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...