2013-04-29 4 views
0

Ember-Data 거래에 문제가 있습니다.Ember-Data 거래 오류

나는, 그것은 나중에과 같이 시작된다 그리고 이렇게

App.MyModel = DS.Model.extend({ 
    id: DS.attr(), 
    answers: DS.hasMany('App.Answer') // another model 
}); 

같은 DS.Model을 가지고있는 라우트

model: function(){ 
    var transaction = this.get('store').transaction(); 

    return transaction.createRecord(App.MyModel, { 
     id: '1' 
    }); 
} 

내 백 엔드에 요청을하게하는 모델을 트랜잭션을 사용하고 커밋하는 서버.

this.get('content.transaction').commit(); 

답변이 서버 측에서 업데이트되어 다시 전송되도록합니다. 컨텐츠가 아직 업데이트되지 않은 경우 , 나는이

this.get('content').reload(); 

전화 요청이 다시 전송됩니다.

이 모든 것이 정상적으로 작동합니다. ID가 발견되면 답변이 채워집니다.

제 문제는 때로는 서버에서 무엇을 얻 느냐에 따라 다른 서버 요청을해야한다는 것입니다. 초기 요청이

this.get('content.transaction').commit(); 

와 함께 잘 작동하지만 트랜잭션을 다시로드 할 때

Uncaught Error: Attempted to handle event `loadedData` on <App.Answer> while in state rootState.loaded.updated.uncommitted. Called with undefined 

내가 다시로드를 제거 할 때 지금, 나는 더 이상 오류가 발생하지 않습니다를 다음과 같이 나는 오류가 발생, 또한 네트워크 탭에서 Chrome 콘솔을 확인하면 원하는 결과가 다시 전송되지만 내 DS 모델에서 업데이트되지 않는 것을 확인할 수 있습니다. 대답은 정의되지 않은 상태로 남습니다.

왜 이런 일이 발생하는지 알고 계십니까? 거래를 잘못 사용하고 있습니까? 내 모델을 설정하고 내용을 설정하는 내 경로에서 수행에

편집

Application.SearchController = Ember.ObjectController.extend({ 
    isComplete: function() { 
     return this.get('content.answers.length') !== 0; 
    }, 


    search: function() { 
     this.get('content.transaction').commit(); 

     var record = this.get('content'); 

     var interval = setInterval(function (controller) { 
      if (controller.get('isComplete')) { 
       controller.transitionToRoute("search.view"); 
       clearInterval(interval); 
      } else { 
       record.reload(); 
      } 
     }, 5000, this); 
    } 
}); 

SO 기본적으로 몇 가지 작업이 모델은 서버 측에서 사용 및 전송됩니다 id를 가지고 다시 검색 결과와 함께 "답변"에 추가됩니다.

이 결과는 여러 개의 결과가 나타날 때까지 유효합니다. 그런 다음 새 모델이 만들어지고 검색 기능이 다른 콘트롤러에서 다른 콘텐트로 다시 호출됩니다. 이번에는 라인상에서 record.reload();

오류가 발생합니다. 오류가 발생했습니다 : rootState.loaded.updated.uncommitted 상태 인 동안 loadedData 이벤트를 처리하려고 시도했습니다. 정의되지 않은 상태로 호출 됨

따라서 서버는 여전히 올바른 결과를 반환하지만 클라이언트 측에서 "답변"은 업데이트되지 않습니다.

답변

0

트랜잭션을 커밋 최초의 후 기본 트랜잭션에 배치됩니다 :

은 당신이 원하는 것은 그 같은 것입니다.

Error Attempted to handle event `loadedData` : Object not updated after deleteRecord

그리고 처음으로 항상 설치를 라우터를 기억한다.

+0

나는 Crowhurst 씨를 시도했지만 작동하지 않았다. – johnjo

+0

당신은 결국 Crowhurst 씨에게 맞았다. 나는 라우터를 다시해야했다. – johnjo

0

MyModel 레코드가 로컬로 수정됩니다 (클라이언트 측). reload을 호출하면 레코드의 현재 상태에서 금지 된 레코드를 업데이트하려고 시도합니다.

당신은 명령으로이를 확인할 수 있습니다

console.log(this.get('content.stateManager.currentState.path')); 
this.get('content').reload(); 

이 레코드가 uncommitted 상태에있는 콘솔에 표시됩니다.

업데이트 :

타이머를 사용할 수 없습니다. 모든 것이 비동기식이므로 해당 기간 동안 모델이 업데이트된다는 보장이 없습니다. 즉, 레코드를 커밋하는 동안 동시에 다시로드 할 수 있습니다 (이렇게하면 오류가 생성됩니다).

Application.SearchController = Ember.ObjectController.extend({ 
    search: function() { 
     var record = this.get('content'), 
      controller = this; 

     record.one('didCommit', function() { 
      controller.transitionToRoute("search.view"); 
     }); 

     record.transaction.commit(); 
    } 
}); 
+0

나는 결론을 내렸다. 기본적으로 오류 메시지가 표시됩니다. 이 문제에 대한 해결책이 있다면 거래를 올바르게 사용하고 있습니까? – johnjo

+0

실제 문제를 지적 할 수있는 코드가 충분하지 않습니다. App.MyModel 레코드를 수정하기 위해 앱에서 무엇을하는지 모른다. 'commit' 후에'reload'를 호출하는 논리는 위험한 것처럼 보입니다. –

+0

더 많은 설명으로 내 질문을 업데이트했습니다. – johnjo