2012-09-29 2 views
1

서버가 데이터를 반환 한 직후 사용자 정의 날짜 형식으로 타임 스탬프를 변환하려고합니다. Ext.data.field에서 "convert"를 사용하려고했습니다 : http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Field-cfg-convertExtJS4.1 모델에서 타임 스탬프를 사용자 지정된 날짜 형식으로 변환하는 방법은 무엇입니까?

하지만 제대로 만들 수 없습니다. 이것은 내 모델입니다.

Ext.define('AM.model.Comment',{ 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'createdTime', type: 'date', convert:function(v,record){record.parseDate(v,record);}}, // datetime 
    ], 

    proxy: { 
     type: 'rest', 
     url:'../comments', 
     writer:{ 
      type:'json' 
     }, 
     reader: { 
      type: 'json' 
     } 
    }, 
    parseDate:function(v,record){ 
     console.log(v); //show 1347465600000 
     console.log(Ext.Date.format(new Date(v), 'Y-m-d')); //show 2012-09-13 
     return Ext.Date.format(new Date(v), 'Y-m-d'); 
    } 
}); 

로드 후, 나는 방화 광을 점검하고 "createdTime"필드가 "정의되지 않음"임을 알았습니다. 누군가 내 실수를 지적 할 수 있습니까? 감사!

"변환"을 사용하지 않고도 다른 구성 요소에 Ext.Date.format(new Date(v), 'Y-m-d')을 사용하면됩니다. 그러나 나는 그것을 모델에서하는 것이 더 나을 것이라고 생각한다. 그런 다음 모든 구성 요소는 항상 올바른 날짜 형식을 쿼리로 읽을 수 있습니다.

+0

을해야 당신의 변환에 수익을 누락? –

+0

음 ... createdTime을 가져올 때 다른 구성 요소가 Y-m-d 문자열을 읽고 서버에 새 주석을 게시 할 때 날짜 형식을 쓰길 원합니다. – Amy

+0

즉, 구성 요소는 createTime을 문자열로 액세스하고, 서버는 날짜 객체로 액세스합니다. – Amy

답변

5

해결책을 찾았습니다. "convert"를 사용하는 대신 독자의 getData() 메서드를 재정의합니다.

Ext.define('AM.model.Comment',{ 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'createdTime', type: 'datetime'}, 
    ], 

    proxy: { 
     type: 'rest', 
     url:'../comments', 
     writer:{ 
      type:'json' 
     }, 
     reader: { 
      type: 'json', 
      getData:function(data){ 
       for(i = 0; i < data.length; i++){ 
        data[i].createdTime = Ext.Date.format(new Date(data[i].createdTime), "Y-m-d"); 
       } 
       return data; 
      } 
     } 
    } 
}); 

더 좋은 해결책이 있다면 누구에게 말해주세요. 그리고 나는 아직도 "개종 한"것이 효과가 없었던 이유를 궁금해합니다. 아무도 이유를 알지 못한다면 나에게도 말해주십시오. 감사!

0

모델에서 매핑을 수행 할 수 있습니다. 나는 주된 문제, 당신이 '변환'기능에서 '돌아 오는'단어를 놓쳤다 고 생각한다.

작동하지 윌의 경우, 포맷하기 전에 자바 스크립트 날짜로 변환하려고

Ext.define('AM.model.Comment',{ 
extend: 'Ext.data.Model', 
fields: [ 
    { 
     name: 'createdTime', type: '**datetime**', convert:function(v,record){ 
     return Ext.Date.format(new Date(v), 'Y-m-d'); 
     } 
    }, 
], 

proxy: { 
    type: 'rest', 
    url:'../comments', 
    writer:{ 
     type:'json' 
    }, 
    reader: { 
     type: 'json' 
    } 
} 

});

2

답변을 저장하는 사람은 누구나 해당 작가를 고려하지 않습니까? 형식화 된 날짜로 표시하는 것은 행의 렌더러()를 구현하면 쉽게 수행 할 수 있지만 읽기/쓰기는 모델의 기능을 구현해야 할 수도 있습니다. 시간 (밀리 초)을 나타내는 반면 하나, 그 일부를 생략 할 수 있지만, 자바 스크립트 시간 PHP로부터 변환율 1000 인 것을 고려하면 (예에서 rawValue 어느 정수 유형 또는 유형 날짜 일 수있다) :

Ext.define('AM.model.Comment', { 
    extend: 'Ext.data.Model', 
    fields: [{ 
     name: 'createdTime', 
     type: 'DATETIME', 

     /* .convert() is triggered twice - on read and on write */ 
     convert: function(rawValue, model) { 

     /* only convert, when rawValue appears to be an integer */ 
     if(parseInt(rawValue) > 0){ 
      return Ext.util.Format.date(new Date(parseInt(rawValue)*1000), 'Y-m-d'); 
     } 

     /* it's a date already */ 
     else if(typeof(rawValue) == 'object'){ 
      return rawValue; 
     } 
     } 
    }] 
}); 
1

여전히 신경 써야하지만 전환 솔루션이 효과가 있을지는 모르겠지만 수익이 누락되었습니다. 이것이 당신이 가진 것입니다. 당신이 그것을 보면

fields: [ 
    { name: 'createdTime', type: 'date', convert: function(v, record) { 
     record.parseDate(v,record); 
    }}, // datetime 

는 그래서 그래서, 당신이 날짜 개체로, 문자열로 필드가하지 싶어이

{ name: 'createdTime', type: 'date', convert: function(v,record) { 
     return record.parseDate(v,record); 
    }}, // datetime 
+0

처음으로 나는 down-voted했다. 왜냐하면 하나 또는 다른 메소드가 반환되는지는 중요하지 않기 때문에 ... 실제로 모델의 범위 내에서는'record'라는 객체가 없기 때문에'parseDate ()'... 예. 'this.parseDate()' –

관련 문제