2012-10-31 2 views
6

FIRST : 나는이 질문을 여기에 질문했습니다. in ExtJS, is it better to call Model.save() or Store.Sync()? - 그러나 XHR 및 클라이언트와 서버 모두에 불필요한 오버 헤드가 발생합니다. 나는이 점들 중 하나가 연결된 질문에서 다루어 졌다고 생각하지 않는다.ExtJS 4.1 - Store.add() (다음에 동기화) vs Model.save()

많은 모델, 뷰 및 컨트롤러로 구성된 엔터프라이즈 자원 관리를 위해 설계된 다소 큰 응용 프로그램이 있습니다. Ext.Ajax requestCompleterequestException 이벤트에 대한 수신기를 설정하여 서버의 모든 응답을 처리합니다. 모든 모델의 프록시 afterRequest 이벤트에 중복 이벤트 처리기를 작성하는 대신이 방법을 사용했습니다. 이렇게하면 세 개의 매개 변수, 즉 , messagedata으로 응답하는 모든 백엔드 (젠드 프레임 워크 사용) 컨트롤러를 가질 수 있습니다.

요청이 성공하면 (즉, HTTP 200) requestComplete 메소드가 앞서 언급 한 매개 변수에 대한 JSON 응답을 검사합니다. successfalse 인 경우 message에 오류 메시지가 표시되고 사용자에게 표시됩니다 (예 : '해당 제품을 저장하는 중에 문제가 발생했습니다. 잘못된 제품 이름'). 성공한 경우 요청 유형 (예 : 만들기, 읽기, 업데이트 또는 삭제)에 따라 조치가 취해집니다. create이 성공하면 레코드가 삭제 된 후 새 레코드가 적절한 데이터 저장소에 추가됩니다.

레코드를 상점에 추가하고 상점의 sync 메소드를 호출하여 XHR 및 그렇지 않은 라운드 트립을 최소화하기보다는이 접근 방식을 선택했습니다. 데이터 저장/업데이트의 현재 방법은 요청을 백엔드로 보내고 Ext 프론트 엔드의 결과에 응답하는 것입니다. 모델을 데이터로 채우고 생성/업데이트 요청을 위해 model.save()를 호출하거나 데이터를 제거하기 위해 model.destroy()를 호출하여이 작업을 수행합니다.

저장소에서 레코드를 추가/업데이트/제거 할 때 store.sync()를 호출 할 때 서버의 응답에 반응해야한다는 것을 알게되었습니다. 내가 false에 상점의 autoSync 세트를 가지고 호출 store.sync()

  1. 먼저 store.remove()
  2. 을 통해 저장소에서 레코드를 제거 : 기록을 삭제, 예를 들어보십시오.
  3. 저장소의 모델 프록시에서 AJAX destroy 요청을 시작합니다.
  4. 데이터베이스에서 행을 삭제하는 동안 서버에 오류가있는 경우 응답은 success: false을 반환하지만 레코드는 이미 ExtJS 데이터 저장소에서 제거됩니다.
  5. , store.load() (둘 다 왕복해야 함)을 요청하거나 요청에서 레코드를 가져 와서 추가 동기화 /로드를 호출하지 않으므로 commitChanges() 다음에 저장소에 다시 추가하여 피할 수 있습니다. 불필요한 왕복.

같은는 서버가 데이터베이스에 데이터를 추가하는 동안, 기록에서는 ExtJS 저장소에 여전히 및 store.sync() 또는 store.load()와 왕복을 방지하기 위해 수동으로 제거해야합니다 어딘가에 실패 할 경우, 레코드를 추가 간다.

이전에 설명했듯이 이러한 전체 문제를 피하기 위해 내 모델 개체 중 하나 (예 :제품 모델)에 데이터를 채우고 myModel.save()으로 전화하십시오. 그러면 모델의 ID에 따라 프록시의 create 또는 update이 호출되고 적절한 AJAX 요청이 발생합니다. 백 엔드에 오류가 발생해도 프런트 엔드 저장소는 변경되지 않습니다. 요청이 성공하면 (예 : HTTP 200이 아닌 success: true) 저장소에 레코드를 직접 추가하고 store.commitChanges(true)을 호출하여 불필요한 오버 헤드를 피하고 추가 왕복없이 저장소와 효과적으로 동기화합니다. 모든 요청에 ​​대해 서버는 새/수정 된 데이터와 success 매개 변수로 응답하고 조건부로는 클라이언트에 표시 할 메시지를 응답합니다.

여기에 뭔가가 누락되었거나 XHR 및 서버/클라이언트 오버 헤드를 최소화하는이 방법이 바람직합니까? 요청해야하는 예제 코드를 제공하게되어 기쁩니다. 그러나 이것이 기본 코드를 사용하는 다소 일반적인 개념이라고 생각합니다.

+1

[1], 내가 찾은이 [링크]를 살펴 보자 그것은 매우 도움이 [1] : http://stackoverflow.com/questions/11022616/store-do-something-after- sync-with-autosync-enabled – Amin

+0

@Amin 확실하게 도움이되는 방법입니다. 응용 프로그램의 대부분의 부분에서 model.save()를 수행하지만, 내장 된 저장소 동기화를 사용할 때는 매우 유용합니다. 고맙습니다! –

답변

2

나는 당신이 웅변적으로 당신의 입장을 주장했다고 ​​생각합니다. 나는 당신이 취한 직위에 문제가있는 것을 보지 못합니다. 필자가 할 수있는 유일한 단점은 편집 가능한 그리드를 지원하는 상점의 autoSync 설정이 관리 작업은 적지 만 작업을 완료하는 데는 훨씬 덜 장황한 방법이라는 점입니다.

추가하려면 일반적으로 예상하지 못한 오버 헤드 또는 특수 처리 또는 추가 새로 고침이 필요한 가장자리의 경우를 호출합니다. 이러한 특정 사례에 대한 청취자를 추가하고 나머지는 간결한 기본값으로 유지할 수 있습니다.

+0

입력 해 주셔서 감사합니다. 나는 실제 패킷 크기와 전체 네트워크 트래픽에 대해별로 신경 쓰지 않았 음을 인정할 것이다. 이벤트를 실행하여 괴상한 거래를 처리하는 방법이 마음에 듭니다.이 접근 방식을 고치고 느끼는 방식을 살펴야합니다. +1에 대한 통찰력이있는 의견 –

+0

동기화 (synchronization)와 저장 (save) 사이에 차이가 없어야합니다. 왜냐하면 둘 다 동일한 (잠재적으로) 프록시를 사용하여 서버와 통신하기 때문입니다. – dbrin