2014-04-25 3 views
2

내 API 위에 Ember 앱을 만들고 있는데, 잘못된 레코드로 인해 저장에 실패하더라도 Ember가 내 템플릿을 업데이트하는 이유가 궁금합니다 (예 : API가 422) : API가 어떤 값을 허용하지 않기 때문에 save()가 실패하면 ember가 템플릿을 업데이트하지 못하도록합니다.

data.set('name', 'some_invalid_stuff'); 

data.save().then(function() { 

    // close modal 
    _this.closeForm(); 

    // disable editing mode 
    _this.set('isEditing', false); 

}, function (response) { 

    _this.set('errors', response.errors); 
    data.rollback(); 

}); 

내가 data.rollback();을 주석

는, 템플릿이 잘못된 기록으로 업데이트됩니다. data.rollback();의 문제는 이상한 깜박임입니다. 첫째, 레코드가 템플릿에서 업데이트되지만 몇 밀리 초 후에 rollback이 실행되고 이전 데이터로 템플릿이 업데이트됩니다.

특히 알파벳순으로 목록을 정렬하는 경우이 "이중 업데이트"는 매우 성가시다.

save()이 실패 할 때 템플릿 업데이트를 방지하는 방법이 있습니까?

실제로 템플릿은 data.set('name', 'some_invalid_stuff'); 이후 즉시 업데이트됩니다.

나는 최신 안정 Ember 릴리스 (1.5.1)와 최신 Ember-Data의 Canary 버전을 사용하고 있습니다 (그러나 최신 Beta 버전도 시도했습니다).

답변

2

간단한 설명은 모델이 변경되고 모델을 변경했을 때 Ember가 템플릿을 업데이트한다는 것입니다. 엠버 (Ember)는 이 실제로에 영향을 미치기 전에 다른 곳으로 변경해야하는지 여부를 알지 못하거나 신경 쓰지 않고, 사용자가 제공 한 데이터에 대해서만 알고 있습니다.

이 동작을 실제로 원하지 않으면 어떻게 든 데이터를 복제해야합니다. 그렇게하면 모델 데이터를 변경할 수 있고 복제 된 데이터는 변경되지 않으므로 템플릿을 업데이트 할 수 없습니다.

그러나 나는 그것을 반대하는 것이 좋습니다. 거의 모든 저장 조작이 성공해야하기 때문에 대부분의 사용자는 템플리트가 즉시 갱신되는 것을 신경 쓰지 않습니다. 저장 조작이 실패하는 것은 매우 드문 경우입니다. 나는 클라이언트 측에서 가능한 한

  1. 만큼 검증을 수행합니다 나를 위해, 나는 사용자에게 더 쾌적한 세 가지 일을. 서버가 거부 할 데이터를 보내지 마라. 그것은 왕복을 낭비하는 것이다.

  2. 네트워크 문제로 인해 저장에 실패하면 다시 시도하십시오. 두 번째는 매력입니다.

  3. 저장이 여전히 성공하지 못하면 변경 사항을 롤백하지 마십시오. 오류 메시지를 제시하고 나중에 다시 시도 할 수있는 기회를 제공하십시오.

즉, 이러한 시나리오를 처리 할 수있는 기본 제공 기능이 없습니다. 응용 프로그램에 적합한 방식으로 직접 처리해야합니다.

+0

맞습니다. 훨씬 더 많은 클라이언트 측 유효성 검사를 추가해야합니다. 그럼에도 템플릿 업데이트가 필요하지 않은 시나리오가 있습니다. 예 : 같은 이름의 다른 레코드가 있으면 서버가 유효성을 검사 할 때. 그런 다음 템플릿은 곧 422 서버 오류 후 '잘못된'이름과 롤백을 설정합니다. 클라이언트 쪽에서 처리 할 수없는 몇 가지 유효성 검사가 있으며 "깜박임"템플릿 업데이트는 실제로 나빠질 것입니다. 템플릿에 '더티 (dirty)'레코드를 업데이트하지 못하게 할 수 있습니까? 정말 멋질거야. – Slevin

관련 문제