2013-10-22 78 views
1

過去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(); 
    } 
} 

我停止自動同步,那麼我在本地進行更改,恢復自動同步並最終同步所有更改。

回答

1

這是ExtJS的更新數據如何:

  1. 它發送具有JSON數據
  2. 它解析響應的請求。
    • 如果記錄更新正確,它將放棄隊列中的更新操作。
    • 如果記錄未能更新,它將保持隊列中的更新操作並在下次重新發送。

爲什麼你每次請求重發是你從服務器得到的迴應是不正確的原因。當從cls更新Clscls2,你發這個給服務器:

{"id":7,"StartDate":"2013-01-06","EndDate":"2013-01-08","Cls":"cls2","Draggable":true,"Resizable":true} 

服務器應與

{"success":true,"data":[{"id":7,"StartDate":"2013-01-06","EndDate":"2013-01-08","Cls":"cls2","Draggable":true,"Resizable":true}]} 

迴應,但在你的情況下,它會返回所有行沒有更新,這是不正確地"Cls":"cls"。這告訴ExtJS,即使您發送success: true,更新也不成功。這就是爲什麼ExtJS將重新發送更新操作的每個store.sync()

+0

我測試了相同的代碼,但我的後端返回狀態200 OK,這是正確的PUT響應(RFC2616)。所以即使當我的服務器沒有返回任何內容時,我仍然收到這些請求。我會修改我的代碼,看看是否有改變。但我認爲'200 OK'(沒有數據)應該沒問題。想象一下,我正在更新商店中的300件商品。那就是要發送很多數據,而且要接收(當服務器需要返回數據時) – Misiu

+0

看,狀態碼本身是不夠的。 ExtJs期待更新記錄的「成功」參數和新內容。 –

+0

感謝您的澄清,我過去一次更新了一個項目,一切都很順利,但我必須說我沒有計算請求。我會馬上修改我的測試代碼:) – Misiu

相關問題