ошибка передачи данных в extjs 4.0.2a mvc - PullRequest
0 голосов
/ 30 января 2012

код моей модели

Ext.define('gantt.model.Project', {
    extend: 'Ext.data.Model',   
    fields : [
              { name: 'id', type: 'int', useNull: true, mapping: 'projectid'},
              { name: 'title', type: 'string', mapping: 'projecttitle'},
              { name: 'name', type: 'string', mapping: 'projectname'},
              { name: 'description', type: 'string', mapping: 'projectdesc'},
              { name: 'startdate', type: 'date', mapping: 'startdate', dateFormat :'time'},
              { name: 'enddate', type: 'date', mapping: 'enddate', dateFormat :'time'},
          ]

});

мой вид

Ext.define('gantt.view.projectmgt.projectAdd', {
    extend: 'Ext.form.Panel',
    alias: 'widget.projectadd',
    title: 'New Project Detail Input Window',
    width: '50%',

    xtype:'fieldset',
    title: 'Project Details',
    collapsible: true,
    defaultType: 'textfield',
    layout: 'anchor',
    defaults: {
        anchor: '100%'
    },
    items :[{
            fieldLabel: 'Title',
            name: 'title',
            xtype: 'textfield'              
        },{
            fieldLabel: 'Name',
            name: 'name',
            xtype: 'textfield'
        },{
            fieldLabel: 'StartDate',
            name: 'startdate',
            xtype: 'datefield',
            format: 'Y/m/d'
        },{
            fieldLabel: 'EndDate',
            name: 'enddate',
            xtype: 'datefield',
            format: 'Y/m/d'
        }, {
            xtype: 'htmleditor',
            name: 'description',
            fieldLabel: 'Description',
            height: 200,
            anchor: '100%'
        }],

    buttons: [{
        text: 'Save',
        action: 'show-gantt-view'
    },{
        text: 'Cancel',
        action: 'cancel'
    }]
});

на панели формы есть кнопка сохранения, когда я нажимаю ее, мой контроллер выполняет следующий метод

createProjectGanttpanel: function(btn) {
        var win = this.getProjectAdd().getForm().getValues();
        console.log('PANEL VALUES ARE ::'+win["startdate"]);
        record = Ext.create('gantt.model.Project');
        record.set(win);
        this.getProjectsStore().add(record);
        this.getProjectsStore().sync();
    }

этот метод присваивает значения модели, а затем сохраняет их в моей базе данных.Но у меня возникла проблема, когда я выбираю дату в формате, напечатанном в Консольном журнале, как «2012/01/31» , но когда я вижу вкладку POST firebug, она показывает начальную дату, переданную как '-19800000 'и enddate переданы как' -19800000 '

На стороне сервера, когда я вижу свою консоль JAVA, она показывает мне "startdate": "1970-01-01T05: 30: 02 "," enddate ":" 1970-01-01T05: 30: 02 ", что неверно.Из-за этого правильная дата не отображается в моей сетке панели.

Что я делаю здесь неправильно в моем коде.Помогите мне найти проблему, чтобы я мог быстро ее решить.

Я использую extjs 4.0.2a mvc и JAVA в качестве технологии на стороне сервера.

Ответы [ 3 ]

0 голосов
/ 31 января 2012

Посмотрите, поможет ли это - я сталкивался с подобной проблемой и решил последовательно использовать даты в формате ISO 8601 в Ext-JS и Spring, вот способ заставить это работать:

http://biju -allandsundry.blogspot.com / 2012/01 / ext-js-json-datetime-mapping-in-spring.html

Подведем итог:

Используйте пользовательский объект Jackson ObjectMapper для записи дат в формате ISO8601:

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig.Feature;
 
public class CustomObjectMapper extends ObjectMapper {
    public CustomObjectMapper(){
        super.configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
    }
}

Зарегистрируйте этот пользовательский сопоставитель объектов:

<mvc:annotation-driven > 
    <mvc:message-converters register-defaults="false">
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
            <property name="objectMapper">
                <bean class="org.bk.simplygtd.web.spring.CustomObjectMapper"/>
            </property>
        </bean>
    </mvc:message-converters>
 </mvc:annotation-driven>

Используйте формат даты 'c' для обработки этого впользовательский интерфейс:

Ext.define('CUSTOM.model.Proj',{
    extend: 'Ext.data.Model',
    fields:[{name:'id', type:'string'},{name:'name', type:'string'}, 
            {name:'startDate', type:'date', dateFormat:'c'}, {name:'completedDate', type:'date', dateFormat:'c'},
            {name:'isDone', type:'boolean'}, {name:'version', type:'string'}]
});

Настройка Ext-JS для отправки дат обратно на сервер в формате ISO-8601:

Ext.JSON.encodeDate = function(o)
{
   return '"' + Ext.Date.format(o, 'c') + '"';
};
0 голосов
/ 19 декабря 2012

Вместо того, чтобы настраивать сторону сервера для принятия фиктивного формата даты, вы могли бы реализовать пользовательский Ext.data.writer.Writer, который просто изменяет все поля даты, чтобы быть доступными для чтения Java. Затем при регистрации прокси просто добавьте writer: 'javajson' в конфиг.

/**
 * Java compatible Json writer
 * @class My.component.data.writer.JavaJson
 * @extends Ext.data.writer.Json
 */
Ext.define('My.component.data.writer.JavaJson', {
  extend: 'Ext.data.writer.Json',
  alternativeClassName: 'My.component.data.JavaJsonWriter',

  alias: 'writer.javajson',

  //inherit docs
  getRecordData: function(record, operation) {
      var data = this.superclass.getRecordData(record, operation),
          fields = record.fields,
          fieldItems = fields.items,
          nameProperty = this.nameProperty,
          field,
          name,
          value;

      for(f = 0; f < fieldItems.length; f++) {
          field = fieldItems[f];
          if(field.type === Ext.data.Types.DATE) {
              name = field[nameProperty] || field.name;
              value = record.get(field.name);
              data[name] = Ext.isEmpty(value) ? value : value.getTime();
          }
      }

      return data;
  }
});
0 голосов
/ 30 января 2012

Ваш формат даты установлен на dateFormat: 'time', вы пытались изменить это на:

dateFormat: 'Y-m-d h:i:s'

Это сработало для меня в аналогичной установке.

ОБНОВЛЕНИЕ 2012-01-30:

Проверьте этот документ API для получения дополнительной информации о форматировании дат в ExtJs: http://docs.sencha.com/ext-js/4-0/#!/api/Ext.Date

...