即使服务器出错,Sencha extjs model.erase 也会删除模型

Posted

技术标签:

【中文标题】即使服务器出错,Sencha extjs model.erase 也会删除模型【英文标题】:Sencha extjs model.erase removes model even when server error 【发布时间】:2017-06-21 14:43:22 【问题描述】:

当调用 model.erase(failure..., success...) 时,即使服务器响应 HTTP StatusCode 500,模型也会被删除。失败监听器被正确触发,但我希望那个模型不会被破坏。我可以看到它已被销毁,因为它已从商店中移除。

var rec = store.getAt(index);
rec.erase(
     success:function(record, operation)
        // Do something to notify user knows
     
     failure:function(record, operation)
        // correctly triggered when HTTP = 40x or 50x
        // Would expect that record is still in store. Why not?
        // Of course i could add it again to store with store.add(record) but is that the prefered way?
     
);

我在 Extjs 6.0 中使用 AJAX 代理

【问题讨论】:

【参考方案1】:

是的,erase 方法会立即从存储中删除记录,而无需等待服务器的响应。处理您的场景的“hacky”方式将是:

将记录的dropped 属性设置为true; 使用save方法保存记录(它会生成删除请求但会将记录保留在存储中);

成功时从存储中删除记录,失败时将dropped 属性重置为false。

var record = store.getAt(index);
record.dropped = true;
record.save(
    success: function() 
        store.remove(record);
        // do something to notify the user
    
    failure: function() 
        record.dropped = false;
    
);

【讨论】:

【参考方案2】:

erase 在这里并不重要。调用erase 调用模型drop 方法,将其标记为待删除并将其从任何存储中删除。仅仅因为服务器未能从服务器中删除它并不一定意味着您希望它回到商店中,它仍然只是等待删除。

【讨论】:

那么最好的方法是什么? 在模型上调用 reject 以重置丢弃状态,然后如果您想要这样做,则将其重新添加到商店。 好的,我明白了。已经猜到了,但后来它被添加到不同的位置。 extjs方式就没有更好的方式吗? 正在测试这两种方法,似乎最直接的是来自@Evan Trimboli 的方法。在失败回调中,您只需执行 record.reject 和 store.add(record) ,一切似乎都很好

以上是关于即使服务器出错,Sencha extjs model.erase 也会删除模型的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将 Sencha Touch 转换为 Sencha EXTJ(或将 EXTJ 转换为 Touch)?

ExtJS-Data Package (数据处理包)

Ext JS 和 Sencha 的区别

extjs6入门:用sencha cmd搭建简单的extjs6项目

ExtJs Sencha Cmd创建项目以及编译项目

Sencha Touch 和 ExtJS