我正在构建一些模型来与之前项目中的现有API进行交互。
API依赖于标准的POST方法来保存数据。
我已经将模型和代理配置到将数据推送到服务器的位置,但似乎只有两种编写器类型,json& XML。
proxy: {
/* ... */
reader: {
type: 'json',
root: 'results'
},
writer: {
type: '???' // <-- can only see json or xml in the docs
}
}
是否有标准的POST编写器只是在帖子字段中提交数据?
我很惊讶不会是标准的作家类型。
(解析json格式不会太难实现,但这意味着要更新很多旧的api文件。)
答案 0 :(得分:5)
好的,通过检查现有的编写器源代码,我能够非常轻松地创建该编写器。
现有编写者能够做的一件事 - 也就是开发团队只实现了json和xml版本的原因 - 他们可以一次推送多个记录。
这可以在POST中实现,但会有点复杂。
如果您尝试使用POST将单个模型推送到api,那么本作者将会工作:
Ext.define('Ext.data.writer.SinglePost', {
extend: 'Ext.data.writer.Writer',
alternateClassName: 'Ext.data.SinglePostWriter',
alias: 'writer.singlepost',
writeRecords: function(request, data) {
request.params = data[0];
return request;
}
});
并将其用于代理中的编写器:
writer: {
type: 'singlepost'
}
答案 1 :(得分:1)
根据Ben的回答,我实现了自己的编写器,将所有模型的所有属性收集到数组中。 例如,如果您的模型与某些字段类似:
fields:[
{name:'id', type:'int'}
{name:'name', type:'string'}
{name:'age', type:'date'}
]
请求字符串将是
id=1&id=2&id=...&name=oleks&name=max&name=...&age=...
代码:
Ext.define('Ext.data.writer.SinglePost', {
extend: 'Ext.data.writer.Writer',
alternateClassName: 'Ext.data.SinglePostWriter',
alias: 'writer.singlepost',
writeRecords: function(request, data) {
if(data && data[0]){
var keys = [];
for(var key in data[0]){
keys.push(key);
}
for(var i=0;i<keys.length;i++){
request.params[keys[i]] = [];
for(var j=0;j<data.length;j++){
request.params[keys[i]].push((data[j])[keys[i]]);
}
}
}
return request;
}
});
答案 2 :(得分:1)
对于Sencha touch 2.0,将writeRecords方法更改为:
writeRecords: function (request, data) {
var params = request.getParams() || {};
Ext.apply(params, data[0]);
request.setParams(params);
return request;
}
答案 3 :(得分:0)
这是我的版本,改编自上面的答案:
// Subclass the original XmlWriter
Ext.define('MyApp.utils.data.writer.XmlInAPostParameter', {
extend : 'Ext.data.writer.Xml',
// give it an alias to use in writer 'type' property
alias : 'writer.xml_in_a_post_parameter',
// override the original method
writeRecords : function(request, data) {
// call the overriden method - it will put the data that I
// want into request.xmlData
this.callParent(arguments);
// copy the data in request.xmlData. In this case the XML
// data will always be in the parameter called 'XML'
Ext.apply(request.params, {
XML: request.xmlData
});
// Already copied the request payload and will not send it,
// so we delete it from the request
delete request.xmlData;
// return the modified request object
return request;
}
});
Ext.define("MyApp.model.MyModel", {
extend : "Ext.data.Model",
requires : [
'MyApp.utils.data.writer.XmlInAPostParameter'
],
fields : [ 'field_A', 'field_B' ],
proxy : {
type : 'ajax',
api : {
read : '/mymodel/read.whatever',
update : '/mymodel/write.whatever'
},
reader : {
type : 'xml'
},
writer : {
// use the alias we registered before
type : 'xml_in_a_post_parameter'
}
}
});