2013-10-09 12 views
3

자식 구성 요소의 인스턴스 변수를 콜백 내부의 부모 구성 요소에서 설정하려고합니다. 디버거를 사용하여 인스턴스 변수가 콜백에서 올바르게 설정되어 있지만 자식 구성 요소를 렌더링 할 때 자식 구성 요소가 변경 내용을 반영하지 않음을 알 수 있습니다.다른 구성 요소에서 구성 요소의 상태 수정

그래서 해변의 다른 구성 요소에서 구성 요소의 상태를 수정하는 것은 불법입니까, 아니면 내가 잘못한 것을하고 있습니까?

예제 코드 :

MyParentComponent>> initialize 
    super initialize. 
    child := MyChildComponent new. 

MyParentComponent>> renderContentOn: html 
    html render: child. 
    html anchor 
    callback: [ 
     child property: 'Something'. 
    ] ; with 'Navigate'. 

MyParentComponent>> children 
^Array with: child 
+0

문제의 원인을 나타내는 코드를 게시하는 것이 도움이됩니다. –

+0

내 코드의 일부를 추가했습니다. MyChildComponent는 인스턴스 변수 'property'를 가지며 값은 렌더링에 사용됩니다. – raphonic

답변

1

약간의 실험을 마친 후에 문제가 발견되었습니다. 렌더링 방법 중 하나에서 페이지를 렌더링 할 때마다 initialize 메서드에서 만든 메서드를 다시 사용하지 않고 새 구성 요소를 만들었습니다.

다른 구성 요소가 탐색에 사용되었습니다. 여기에서 선택한 메뉴를 기반으로 표시 할 기본 구성 요소를 설정합니다.

그래서 분명히 상태를 수정하는 것은 해변에서 불법이 아닙니다.

+1

상태를 수정하는 것은 콜백에서 "불법"이 아닙니다. 렌더링 방법에서 "불법"입니다. 경험 한 버그는 별개로, 주 역 추적에 문제가 있습니다. Seaside는 렌더링하기 전에 구성 요소의 상태를 저장합니다. "뒤로"를하면 Seaside가 그 상태를 복원합니다. 그러한 경우, 귀하는 그러한 주 변경 사항을 잃게됩니다. 따라서 렌더링하는 동안 상태를 변경하지 마십시오. –

+0

나는 그것을 염두에 두겠다. 고마워. – raphonic

4

당신은 내가 추측 부모 구성 요소의 일부 super initialize를 그리워.

이 방법으로 작업하지 않는 것이 좋습니다.

MyParentComponent>>child, 또한

^child ifNil: [ child := MyChildComponent new ] 

로는 html render: child하지만 html render: self child을하지 마십시오. 그런 식으로 구성 요소를 쉽게 교체 할 수 있습니다.

그런 식으로 아이가 제대로 초기화되었는지 확신 할 수 있습니다.

+0

죄송합니다. super를 올바르게 초기화했습니다. 붙여 넣기 실수로 복사했습니다. – raphonic

+0

Lazy 초기화는 Seaside에서 좋은 방법이 아닙니다. 그 이유는 렌더링하는 동안 구성 요소 상태를 수정해서는 안됩니다. 구성 요소는 완전히 초기화되어야합니다 (하위 구성 요소 포함). lazy init을 사용하면 렌더링하는 동안 효과적으로 상태를 변경할 수 있습니다. –

+0

거기에 lazy init을 사용하면 아이들이 제대로 초기화 할 수 없습니까? 나는 자기 xxx를 사용하지 않는 것이 고통임을 안다. 경우에 대비하여 개발하는 동안 물건을 바꿔야합니다. – philippeback

관련 문제