2013-10-09 63 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方法中創建的組件。

另一個組件用於導航,其中我根據所選菜單設置要顯示哪個主要組件。

顯然,在Seaside中修改狀態並不違法。

+1

修改狀態在回調中不是「非法」的。渲染方法是「非法」的。除了您遇到的錯誤之外,您還會遇到狀態回溯問題。 Seaside在渲染之前保存組件的狀態。當你做一個「返回」時,海濱會恢復這個狀態。在這種情況下,你將失去這些狀態變化。所以在渲染時不要改變狀態。 –

+0

我會記住這一點,謝謝。 – raphonic

4

你錯過一些super initialize在我猜父組件。

我也建議你不要這樣工作。

做一個MyParentComponent>>child

^child ifNil: [ child := MyChildComponent new ] 

另外,不要做一個html render: childhtml render: self child。 這樣你就可以輕鬆地交換組件。

這樣你就可以確定孩子已被正確初始化。

+0

哎呀,對不起,我已經正確設置了超級初始化。製作了錯誤的複製粘貼。 – raphonic

+0

懶惰初始化在Seaside中不是一個好習慣。原因是您在渲染時不應該修改組件狀態。組件應該完全初始化(包括子組件)。如果你用惰性init來做,你將在渲染時有效地改變狀態。 –

+0

如果我們在那裏使用惰性init,是不是兒童會讓他們正確初始化?我發現不使用自我xxx是一種痛苦。以防萬一我需要在開發過程中更改內容。 – philippeback

相關問題