当 ajax 调用失败时,如何阻止 Bootstrap x-editable 更新已编辑的字段?

Posted

技术标签:

【中文标题】当 ajax 调用失败时,如何阻止 Bootstrap x-editable 更新已编辑的字段?【英文标题】:How do I stop a Bootstrap x-editable from updating an edited field when ajax call fails? 【发布时间】:2013-05-20 15:28:49 【问题描述】:

我正在传递一个函数作为 url。

$('.order-price').editable(
    type: "text",
    title: "Order Price",
    url: function (params) 
        var orderID = $(this).data("order-id");
        var data = "OrderID=" + orderID + "&Price=" + params.value;

        $.ajax(
            type: 'post',
            url: '/Trades/SetOrderPrice',
            data: data,
            async: false,
            error: function (xhr, ajaxOptions, thrownError) 
                return false;
                // Do I return something here instead of false?

            

        )
    
);

【问题讨论】:

弃用通知:jqXHR.success()、jqXHR.error() 和 jqXHR.complete() 回调自 jQuery 1.8 起已弃用。要为最终删除准备代码,请改用 jqXHR.done()、jqXHR.fail() 和 jqXHR.always()。 vitalets.github.io/x-editable/docs.html 显示了一些方法,例如 disable() 你不能使用它们吗? 'disabled()' 方法用于禁用字段的编辑功能...这并不能解决问题。 【参考方案1】:

你有两个选择,要么在回调中抛出异常,而 x-editable 将自己捕获它,或者你可以使用“成功”事件并在成功函数中返回一个空字符串,然后你就设置好了

【讨论】:

这对我来说难以置信有用!!!!只需return ""; 就可以完美运行!!! 从成功回调中返回空字符串是不可接受的选项。来自 xEditable 文档:“如果(成功回调)返回字符串 - 表示发生错误并且字符串显示为错误消息。” - 所以你最终会得到一个错误的字段,但没有错误消息。 如果您使用“内联”字段,这似乎没问题。但是“弹出”字段会受到这种技术的影响。【参考方案2】:

最好使用内置的 ajax 调用,它会在出现错误时自动保留旧值:

$('.order-price').editable(
  type: "text",
  title: "Order Price",
  url: '/Trades/SetOrderPrice', 
  params: function (params) 
    return 
      orderID: $(this).data("order-id"),
      value: params.value        
    ;
  
);

【讨论】:

您好,即使ajax成功,有没有办法保存旧值?【参考方案3】:
error: function (xhr, ajaxOptions, thrownError) 
    var oldValueObj = $(this).editable('getValue'); //get old value obj

    for(var key in oldValueObj) 
        var value = oldValueObj[key]; //get old value in loop if we don't know key

        return newValue: value; //set old value and stop x-editable
    

【讨论】:

【参考方案4】:

由于您是从 url 发出 ajax 请求,一种可能的解决方案是调用可编辑错误方法,您可以在初始化期间跟踪该方法。

url: function(params) 
            var url = '/xxx/yyy/dosomething';

            var success = $(this).data('editable').options.success;
            var error = $(this).data('editable').options.error;

            // call your ajax request and invoke success

             $.ajax(
                type: method,
                url: url,
                data: data
                async: false,
                error: function(x,y,z) 
                  error();
                ,
                success: function(x,y,z) 
                  success();
                
            );

【讨论】:

【参考方案5】:

在函数结束时为 'url' 选项返回一个延迟对象的承诺。返回 this 告诉 x-editable 在该 Deferred 对象上运行 resolve 之前不要更改客户端数据中的值。如果拒绝()最终运行,那么旧值仍然存在。

url: function (params) 

    /***ADD DEFERRED***/
    var d = new $.Deferred()
    var orderID = $(this).data("order-id");
    var data = "OrderID=" + orderID + "&Price=" + params.value;

    $.ajax(
        type: 'post',
        url: '/Trades/SetOrderPrice',
        data: data,
        async: false,
        success: function(data, textStatus, jqXHR) 
           /***RESOLVE THE DEFERRED OBJECT***/
           d.resolve(); 
        ,
        error: function (xhr, ajaxOptions, thrownError) 
            /***REJECT IF ERROR OCCURRED***/
            d.reject(thrownError);
            //d.reject(''); //You could also return just an empty string, but must return a string


        

    )

    /*** RETURN A PROMISE ***/
    return d.promise();

【讨论】:

【参考方案6】:

使用此代码,它成功地为我工作

$(".editable-open").editableContainer("hide");

【讨论】:

以上是关于当 ajax 调用失败时,如何阻止 Bootstrap x-editable 更新已编辑的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 调用阻止其他 javascript 代码

当两个 Ajax 请求被并行调用时,我看到多个加载掩码

AJAX:当函数调用失败/错误时,是不是可以从服务器端返回自定义错误消息? [复制]

AJAX调用会阻止导航到其他页面,直到完成为止

在 jQuery 中,如何在 ajax 调用失败时恢复可拖动对象?

填充最后一个输入时,JQuery ajax 调用失败