최근 코드를 단순화하고 공유 상태를 유지하기 위해 기존의 angular2 앱에 ngrx store를 추가했습니다. 그러나 나는 한 부분에 대해 혼란 스럽다. 처음에는 서버에서 상태를 업데이트하고 병동 이후에는 서버를 확인하지 않고 상태로 작업한다. 예를 들어 백엔드에서 어떤 것이 변경되면 어떻게됩니까? 언제든지 그 페이지를 확인하거나 더 좋은 방법이 있습니까? 기본적으로 상태 데이터가 서버 데이터를 표시하도록 업데이트되었는지 확인하는 가장 좋은 방법은 무엇입니까?내 ngrx 저장소가 서버 측에서 변경 사항을 어떻게 감지합니까?
답변
NGRX Effects을 사용하는 것이 좋습니다. Store와 함께 NGRX Effects를 구현하면 모든 HTTP 부작용이 Effects에 의해 처리되고 Store에서 Action을 사용하여 데이터를 업데이트합니다. 효과는 작업을 수신하고 작업의 페이로드를 사용하여 부작용 (HTTP)을 수행합니다. 효과가 끝나면 새로운 페이로드로 새 액션 (성공을위한 액션 또는 실패 액션)을 호출하여 스토어의 데이터를 업데이트합니다. example in the Effects docs에서
그것이 Login
하는 효과 보여
@Injectable()
export class AuthEffects {
constructor(
private http: Http,
private actions$: Actions
) { }
@Effect() login$ = this.actions$
// Listen for the 'LOGIN' action
.ofType('LOGIN')
// Map the payload into JSON to use as the request body
.map(action => JSON.stringify(action.payload))
.switchMap(payload => this.http.post('/auth', payload)
// If successful, dispatch success action with result
.map(res => ({ type: 'LOGIN_SUCCESS', payload: res.json() }))
// If request fails, dispatch failed action
.catch(() => Observable.of({ type: 'LOGIN_FAILED' }))
);
}
이 예에서, 로그인의 효과 LOGIN
액션을 수신. LOGIN
작업이 발생하면 작업의 페이로드를 사용하고 HTTP POST를 수행합니다. HTTP POST가 반환되면 페이로드에 대한 json 응답을 사용하여 LOGIN_SUCCESS
작업을 호출하거나 LOGIN_FAILED
작업을 반환합니다.
이렇게하면 HTTP와 같은 부작용에 대해 상점이 항상 루프 상태로 유지됩니다. 한 구성 요소가 데이터베이스의 레코드를 업데이트하면 Effect는 Store에 알리고 해당 데이터에 등록 된 모든 구성 요소가 업데이트 된 데이터를 가져와야합니다.
희망이 있습니다.
자세한 답변을 주셔서 감사합니다. 나는 당신이 의미하는 바를 부분적으로 이해합니다. 아직 NGRX 효과를 열지 못했습니다. 하지만 지금은 그렇게 할 것입니다. 그러면 아마도 제 관심사가 해결 될 것입니다. 고마워요. –
효과가 더 복잡 할 정도로 많은 예제가 있습니다. 본질적으로 기존 HTTP 호출은 특정 동작을 수신 한 다음 새 페이로드로 새로운 동작을 반환함으로써 효과로 작동하도록 수정할 수 있습니다. 효과가 새로운 페이로드로 새로운 액션을 호출 할 때까지, 효과가 듣는 액션 (위의 예에서 'LOGIN')은 수정되지 않은 페이로드를 컴포넌트로 즉시 반환하기 만하면됩니다. –
효과에 대한 좋은 설명이 있지만 질문에 대답하지 않았을 수 있습니까? Q에 대한 나의 이해 : 서버의 내용이 변경됩니다 (예 : 사용자 B가 내 목록에있는 Todo를 완료 함). 서버가 다시 신호를 보내면 (Serverside 이벤트, 웹 소켓, Mq ...) 어떤 코드가 저장소 작업을 트리거할까요? – stwissel
[Server Sent Events] (https://en.wikipedia.org/wiki/Server-sent_events)와 같은 서버 알림에 대해 얘기하고 있습니까 –