ExtJs5:如何在Model.save中读取服务器响应

时间:2014-12-23 18:39:08

标签: extjs5

我使用Model.save来保存ExtJs表单中的数据。有时,服务器以下列格式返回操作状态:

{"success": false, "error": {"name": "Invalid Name"}}

以下代码将数据从表单发送到服务器:

var model = formPanel.getRecord();
model.save({
  callback: function(record, operation, success) {
    // operation.response is null,
    // and success === true
    // how to read server response here?
  }
})

服务器响应被视为成功,因为HTTP状态为200.所以我必须读取服务器响应以检查操作状态。但operation.response函数nullcallback

这是我的模特:

Ext.define('My.Model', {
  extend: 'Ext.data.Model',
  idProperty: 'id',
  fields: [
    {name: 'id', type: 'auto'},
    {name: 'name', type: 'auto'}
  ],
  proxy: {
    type: 'rest',
    url: 'api/v1/models',
    appendId: true,
    reader: {
      type: 'json',
    },
    writer: {
      type: 'json'
    }
  }
});

问题:如何在Model.save致电后访问服务器响应?

更通用的问题:使用Model.loadModel.save填充/保存ExtJs表单在语义上是否正确?

我正在使用ExJs 5.0.1.1255。

2 个答案:

答案 0 :(得分:2)

我为此创建了一些简单的测试代码:

var Clazz = Ext.define('MyModel', {
    extend: 'Ext.data.Model',
    proxy: {
        type: 'rest',
        url: 'api/v1/models'
    }
});

var instance = Ext.create('MyModel', {
    name: 'MyName'
});

instance.save({
    callback: function(record, operation) {

    }
});

服务器响应:

{
    success: true,
    something: 'else'
}

你可以在这里看到这个:https://fiddle.sencha.com/#fiddle/fhi

使用此代码,回调具有record参数,record.data包含与服务器响应合并的原始记录。此外,您可以operation.getResponse()(而不仅仅是operation.response)来完全访问服务器的响应。

关于加载vs保存的问题,如果你使用视图模型并以这种方式绑定模型,那么它就变得没有实际意义了,因为你的表单应该始终反映模型的状态。

答案 1 :(得分:1)

使用model.save()Model.load()绝对是正确的做法。

除了提供自定义回调外,您还应调查配置custom proxy。在自定义代理中,您可以提供自己的extractResponseData方法实现。这样您就可以集中检查服务器响应。