2014-02-11 4 views
2

가 나는이 직렬화 기능에 날짜를 구문 분석려는 엠버 변압기에서 오류를 얻고있다.엠버 JS는 오류 변압기 handeling 이벤트의 데이터를 구문 분석하는 동안`didCommit` 상태에서 root.loaded.updated.uncommitted. "

을 이상하게도, 데이터가 올바르게 구문 분석 전송

오류 메시지 : "상태에 root.loaded.updated.uncommitted 동안> 8260357 : ember1597 < (DS.Model의 서브 클래스)에 이벤트 didCommit을 처리하기 위해 시도했습니다." 서버에 연결하십시오.

코드 :

DS.Transform.extend({ 

    deserialize : function(serialized) { 

     var array = []; 

     if (Ember.isArray(serialized)) { 

      serialized.forEach(function(item) { 
       if (item.feldTyp === "DATE_FIELD" && item.value) { 
        Ember.set(item, "value", moment(item.value, "DD.MM.YYYY")); 
       } 
       array.addObject(Ember.Object.create(item)); 
      }); 
     } 

     return array; 
    }, 

    serialize : function(deserialized) { 
     if (Ember.isArray(deserialized)) { 
      deserialized.forEach(function(item) { 
       if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) { 
        item.set('value', moment(item.get('value')).format("DD.MM.YYYY")); 
       } 
      }); 
      return deserialized; 
     } 

     return []; 
    } 
}); 

item.set('value', moment(item.get('value')).format("DD.MM.YYYY"));은 오류가 주석 처리 된 오류를 일으 킵니다. 정적 값을 설정하거나 Ember.set을 사용하여 값을 설정하는 등의 다른 작업을 시도했지만 성공하지는 못했습니다. 나는 여기서 무엇이 잘못되었는지 알지 못하기 때문에 해결책을 생각할 수 없다. 누군가 도울 수 있습니까? 미리 감사드립니다.

편집

해결 방법 : 나는 컨트롤러에 직렬화를 이동했다. 우아하게 보이지는 않지만 지금은 효과가 있습니다 ...

답변

0

엠버 데이터를 알아 냈으므로 데이터는 변환시 set을 사용하는 것을 좋아하지 않습니다. 데이터의 서버 표현은 종종 클라이언트 측에서 표현되는 것과는 다르기 때문에. Ember는 전달 된 값 대신 새 값을 반환하는 serialized 또는 deserialized 값을 수정하지 않기 위해 변환을 수행합니다.

이 오류가 발생하는 이유는 ember가 서버와 관련하여 레코드 상태를 추적하는 상태 시스템을 가지고 있기 때문입니다 (http://emberjs.com/api/data/classes/DS.RootState.html 참조). 이 경우 엠버는 기록을 inFlight 상태로 놓을 가능성이 큽니다. 그런 다음 변환의 serialize 함수를 호출합니다. item.set이 호출되면 ember는 레코드 변경을 알리고 실수로 해당 레코드를 uncommitted 상태로 다시 전환합니다. 레코드가 inFlight 상태에 있다고 가정하면 서버가 저장 요청에 응답 한 후 상태는 didCommit 이벤트를 알리고 레코드는 saved 상태로 전환 될 수 있습니다. uncommitted 상태는 didCommit 이벤트를 지원하지 않으므로 ember는 오류를 발생시킵니다.

set을 호출하지 않고 새 배열을 반환하도록 serialize 함수를 다시 작성하여이 문제를 해결할 수있을 것으로 생각됩니다.

serialize : function(deserialized) { 
     if (Ember.isArray(deserialized)) { 
      return deserialized.map(function(item) { 
       if (item.get('feldTyp') === "DATE_FIELD" && item.get('value')) { 
        return moment(item.get('value')).format("DD.MM.YYYY"); 
       } 
      }); 
     } 

     return []; 
    }