Вложенный v-слот не придерживается новой политики

Я пробовал три разных способа перехвата конструкции объекта Ajax:

  1. Моя первая попытка использовала xhrFields, но это разрешает только один прослушиватель, присоединяется только к загрузке (не загружать), и требует того, что кажется ненужным копированием и вставкой.
  2. Моя вторая попытка приложила функцию progress к возвращенному обещанию, но мне пришлось поддерживать собственный массив обработчиков. Я не мог найти хороший объект для прикрепления обработчиков, потому что в одном месте я мог бы получить доступ к XHR, а другой у меня был бы доступ к jQuery XHR, но у меня никогда не было доступа к отложенному объекту (только его обещание).
  3. Моя третья попытка дала мне прямой доступ к XHR для привязки обработчиков, но снова потребовала много кода для копирования и вставки.
  4. Я завернул свою третью попытку и заменил jQuery на ajax своим. Единственный потенциальный недостаток - вы больше не можете использовать свою собственную настройку xhr(). Вы можете разрешить это, проверив, есть ли функция options.xhr.

На самом деле я нахожу свою функцию promise.progress xhrProgress, поэтому я могу ее легко найти позже. Возможно, вы захотите назвать это чем-то другим, чтобы отделить слушателей загрузки и загрузки. Надеюсь, это поможет кому-то, даже если оригинальный плакат уже получил то, что ему было нужно.

(function extend_jQuery_ajax_with_progress( window, jQuery, undefined ) {
    var $originalAjax = jQuery.ajax;

    jQuery.ajax = function (url, options) {
        if (typeof(url) === 'object') {
            options = url;
            url = undefined;
        }
        options = options || {};

        // Instantiate our own.
        var xmlHttpReq = $.ajaxSettings.xhr();

        // Make it use our own.
        options.xhr = function () {
            return(xmlHttpReq);
        };

        var $newDeferred = $.Deferred();
        var $oldPromise = $originalAjax(url, options)
            .done(function done_wrapper( response, text_status, jqXHR) {
                return($newDeferred.resolveWith(this, arguments));
            })
            .fail(function fail_wrapper(jqXHR, text_status, error) {
                return($newDeferred.rejectWith( this, arguments));
            })
            .progress(function progress_wrapper() {
                window.console.warn("Whoa, jQuery started actually using deferred progress to report Ajax progress!");
                return($newDeferred.notifyWith( this, arguments));
            });

        var $newPromise = $newDeferred.promise();

        // Extend our own.
        $newPromise.progress = function (handler) {
            // Download progress
            xmlHttpReq.addEventListener('progress', function download_progress(evt) {
                // window.console.debug( "download_progress", evt );
                handler.apply(this, [evt]);
            }, false);

            // Upload progress
            xmlHttpReq.upload.addEventListener('progress', function upload_progress(evt) {
                // window.console.debug( "upload_progress", evt );
                handler.apply(this, [evt]);
            }, false);

            return(this);
        };

        return($newPromise);
    };
})(window, jQuery);
0
задан ekjcfn3902039 5 March 2019 в 18:55
поделиться