過去4天,我拉我的頭髮,因爲我遇到了這個問題。 如果我嘗試更新店內的多個商品,我會得到奇怪的有效載荷。 奇怪的是: 第一個請求包含第一個項目的數據, 秒爲第一個和第二個, 第三個爲第一個,第二個和第三個等等。批量編輯 - 不需要的請求或有效載荷
如果我關閉了batchActions,我的商店裏有10件商品的55個請求。
當我編輯30個項目時,我收到了465個請求!
這裏是我的代碼:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="extjs/resources/css/ext-all.css" rel="stylesheet" type="text/css" />
<script src="extjs/ext-all-debug-w-comments.js" type="text/javascript"></script>
<title>Test</title>
<script type="text/javascript">
//MODEL
Ext.define('Test.model.Shift', {
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [{
name: 'id',
type: 'int'
}, {
name: 'StartDate',
type: 'date',
dateFormat: 'Y-m-d'
}, {
name: 'EndDate',
type: 'date',
dateFormat: 'Y-m-d'
}, {
name: 'Cls',
type: 'string'
}, {
name: 'Draggable',
type: 'bool',
defaultValue: true
}, {
name: 'Resizable',
type: 'bool',
defaultValue: true
}]
});
//STORE
Ext.define('Test.store.Shifts', {
extend: 'Ext.data.Store',
model: 'Test.model.Shift',
autoLoad: true,
autoSync: true,//I need this!!!
proxy: {
type: 'rest',
//batchActions: true,
pageParam: false,
startParam: false,
limitParam: false,
noCache: false,
url: 'json.php',
reader: {
type: 'json',
root: 'data'
},
writer: {
type: 'json'
}
},
listeners: {
update: function (store, record, operation, eOpts) {
switch (operation) {
case Ext.data.Model.EDIT:
console.log('INFO', 'Updating record...');
break;
case Ext.data.Model.COMMIT:
console.log('INFO', 'Record was updated!');
break;
case Ext.data.Model.REJECT:
console.log('ERR', 'Something went horribly wrong :(Data was rejected!');
break;
}
},
beforesync: function (options, eOpts) {
console.log(options);
}
}
});
//SCHEDULER
Ext.define("Test.view.Scheduler", {
extend: "Ext.grid.Panel",
alias: 'widget.my_scheduler',
title: 'Scheduler',
region: 'center',
split: true,
initComponent: function() {
var me = this;
me.store = Ext.create("Test.store.Shifts");
Ext.apply(me, {
columns: [{
text: 'Id',
dataIndex: 'id',
hideable: false,
width: 260,
sortable: true,
resizable: false
}, {
text: 'Cls',
dataIndex: 'Cls',
hideable: false,
flex: 1,
sortable: true,
resizable: false
}],
dockedItems: [{
xtype: 'toolbar',
dock: 'top',
items: [{
xtype: 'button',
text: 'Update',
listeners: {
click: function() {
var mixed = me.store.queryBy(function (rec) {
if (rec.data.Cls === 'cls') return true;
});
Ext.each(mixed.getRange(), function (rec, index) {
rec.set('Cls', 'cls2');
}, this);
},
scope: this
}
}]
}],
});
this.callParent(arguments);
}
});
//APP
Ext.application({
name: "Test",
launch: function() {
this.setupLayout();
},
setupLayout: function() {
Ext.create('Ext.Viewport', {
layout: 'border',
margins: 5,
items: [{
xtype: 'panel',
region: 'north',
html: 'test'
}, {
xtype: 'my_scheduler'
}]
});
}
});
</script>
</head>
<body>
</body>
</html>
任何json.php
<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
$list = array();
for ($i = 1; $i <= 10; $i++) {
$list[] = array('id' => $i, 'UserId' => $i, 'StartDate' => '2013-01-06', 'EndDate' => '2013-01-08', 'Cls' => 'cls', 'Draggable' =>true, Resizable =>true);
}
$data = array('success'=>true, data=>$list);
echo json_encode($data);
?>
200 OK是REST服務PUT操作流程頭使服務器不能成爲問題。
我可以刪除batchActions,但這樣我會有不需要的請求,如果我設置了batchActions,我會得到不需要的有效負載。
對此有何建議?
這裏是我的測試頁面:這是我的測試頁面:http://tomasz.jagusz.pl/masterthesis/test/
編輯:
爲了測試我已經編輯自帶的ExtJS的4.2.1原例如其他PUT響應 - restfull
例子。
我已經添加下面的代碼到工具欄:
{
itemId: 'updateAll',
text: 'Update All',
handler: function(){
Ext.each(grid.store.getRange(), function (rec, index) {
rec.set('last', 'Test');
}, this);
}
}
這讓我一次更新所有記錄。
對於這樣的請求:
{"id":1,"email":"[email protected]","first":"Fred","last":"Test"}
服務器與響應:
{"success":true,"message":"Updated User 1","data":{"id":1,"first":"Fred","last":"Test","email":"[email protected]"}}
這應該是罰款,但6條,我得到21名的請求!
這裏是我的另一項測試:http://tomasz.jagusz.pl/masterthesis/test2/restful.html
EDIT 2
下面是版本,現在是爲我工作:
{
itemId: 'updateAll',
text: 'Update All',
handler: function(){
grid.store.suspendAutoSync();
Ext.each(grid.store.getRange(), function (rec, index) {
rec.set('last', 'Test'+ Math.floor(Math.random() * 100) );
}, this);
grid.store.resumeAutoSync();
grid.store.sync();
}
}
我停止自動同步,那麼我在本地進行更改,恢復自動同步並最終同步所有更改。
我測試了相同的代碼,但我的後端返回狀態200 OK,這是正確的PUT響應(RFC2616)。所以即使當我的服務器沒有返回任何內容時,我仍然收到這些請求。我會修改我的代碼,看看是否有改變。但我認爲'200 OK'(沒有數據)應該沒問題。想象一下,我正在更新商店中的300件商品。那就是要發送很多數據,而且要接收(當服務器需要返回數據時) – Misiu
看,狀態碼本身是不夠的。 ExtJs期待更新記錄的「成功」參數和新內容。 –
感謝您的澄清,我過去一次更新了一個項目,一切都很順利,但我必須說我沒有計算請求。我會馬上修改我的測試代碼:) – Misiu