2010-10-20 19 views
1

J'utilise un editorgrid pour modifier des éléments à partir d'un JsonStore. Le JsonStore utilise un HttpProxy pour mettre à jour la base de données principale.ExtJS - Valeurs de date de publication en tant qu'un timestamp Unix

Mon problème est que l'API back-end attend fromTs et toTs pour être timestamp unix, mais quand un enregistrement est mis à jour, le poste http résultant contient une date formatée comme celui-ci: Wed Oct 20 00:00:00 UTC+0200 2010

J'ai cherché la documentation de l'API pour un paramètre pour contrôler le format du message, mais je n'ai rien trouvé. Y a-t-il un moyen simple de le faire?

myJsonStore = new Ext.data.JsonStore({ 
    autoLoad: true, 
    autoSave: true, 
    proxy: new Ext.data.HttpProxy({ 
    api: { 
    create: '/create/', 
    read: '/read/', 
    update: '/update/', 
    destroy:'/destroy/' 
    } 
    }), 
    writer: new Ext.data.JsonWriter({ 
    encode: true, 
    writeAllFields: true 
    }), 
    idProperty: 'id', 
    fields: [ 
    {name: 'id', type: 'int'}, 
    {name: 'fromTs', type: 'date', dateFormat:'timestamp'}, 
    {name: 'toTs', type: 'date', dateFormat:'timestamp'} 
    ] 
}); 

Le editorgrid est configuré comme ceci:

{ 
    xtype: 'editorgrid', 
    clicksToEdit: 1, 
    columns: [ 
     {header: "Id", dataIndex: 'id', editable: false}, 
    {header: "From", dataIndex: 'fromTs', editor: new Ext.form.DateField({format: 'd.m.Y', startDay: 1}), xtype: 'datecolumn', format: 'd.m.Y'},  
    {header: "To", dataIndex: 'toTs', editor: new Ext.form.DateField({format: 'd.m.Y', startDay: 1}), xtype: 'datecolumn', format: 'd.m.Y'} 
    ], 
    store: myJsonStore 
} 

Répondre

1

Je sais que ce cas est vieux, mais je l'ai trouvé une solution à ce problème que je ne suis venu autour de poster ici.

J'ai ajouté un auditeur à l'événement beforewrite du proxy, et manipulé les params post il

proxy: new Ext.data.HttpProxy({ 
    api: { 
     create: '/create/', 
     read: '/read/', 
     update: '/update/', 
     destroy:'/destroy/' 
    }, 
    listeners: { 
     beforewrite: function(proxy, action, record, params) { 
      var fromTs = record.data.fromTs; 
      var toTs = record.data.toTs; 

      if(record.data.fromTs) record.data.fromTs = fromTs.format('U'); 
      if(record.data.toTs) record.data.toTs = toTs.format('U'); 

      // Update record to be sent 
      // root = store.reader.root 
      params.root = Ext.util.JSON.encode(record.data); 

      // Restore record 
      record.data.fromTs = fromTs; 
      record.data.toTs = toTs; 
     } 
    } 
}) 
0

Vous pourriez être en mesure d'accrocher dans l'événement validateedit ou afteredit événement de votre EditorGridPanel et convertir la valeur entrée par l'utilisateur de nouveau dans un horodatage en utilisant une méthode d'analyse de la date. Je devine que EditorGridPanel met à jour les enregistrements dans le magasin verbatim sans les convertir en horodatages, donc vous devez le faire manuellement. Donc, je pense peut-être quelque chose comme:

grid.on('validateedit', function(event) { 
    if (isDateColumn(column)) { 
    event.record.data[event.field] = dateToTimestamp(event.value); 
    } 
} 
+0

Malheureusement, cela ne fonctionne pas. Il semble que les champs de date utilisent ce format de date pour le stockage interne indépendamment des paramètres de format. Lorsque je définis la valeur à un horodatage, le champ de date résoudra cette date non valide. Le message json contiendra toujours le format de date indésirable. '{" id ":" 6 "," fromTs ":" 2010-10-12T00: 00: 00 "," toTs ":" NaN-NaN-NaNTNaN: NaN: NaN "}' –

+0

Votre seule option dans ce cas pourrait être alors de remplacer une partie du comportement dans 'doResponse()' et de créer le POST avec vos propres paramètres, formatés. –

0

Le problème est que le JsonWriter ne respecte pas le champ dateFormat utilisé dans votre JsonReader. Ce post décrit le problème avec du code qui va le résoudre. Vous pouvez le trouver here.