Як працаваць з некалькімі вокнамі і адзінай структуры дадзеных у рэакцыйна-банан

Я задаюся пытаннем, як рэактыўна-банан быў распрацаваны, каб справіцца з наступнай сітуацыяй:

Скажам, у мяне ёсць цэнтральная структура дадзеных. Карыстальнік мае магчымасць свабодна адкрываць і закрываць любую колькасць розных тыпаў вокнаў, што і адлюстраванне дадзеных, а таксама дазваляе карыстачу змяняць яго.

Такім чынам, улічваючы характар ​​гэтага, я не думаю, што проста спрабуе стварыць адну вялікую сетку будзе працаваць добра. Гэта тое, дзе кожнае акно будзе мець сетку і неяк яны былі звязаны?

У іншых сітуацыях, як гэта, я паставіў структуру дадзеных за адзін канал, які кожны паслаў абнаўлення. І тады структура дадзеных будзе «публікаваць» абнаўленне (пажарныя падзеі), што ўсе вокны «прыслухоўваюцца» к.

2

2 адказы

У мяне ёсць праблемы, звязаныя ў адным з маіх праектаў, які выкарыстоўвае нешта падобнае на архітэктуру MVC. Цэнтральная структура дадзеных спасылаюцца як

-- the data is a tree, and it's kept as a zipper to the current node
Discrete MyDataZip

Вось зрэзаная версія маёй заявы кантролера:

data Controller st = Controller {
  dState      :: Discrete st
 ,eUpdateZip  :: Event (MyDataZip -> MyDataZip)
 ,eResponse   :: Event (IO ())
 ,bDiagChange :: Behavior (Diagram Cairo R2 -> Diagram Cairo R2)
 }

Калі пабудавалі, большасць кантролераў атрымаць спасылку dZip :: Discrete MyDataZip , але не маюць магчымасці змяняць яго непасрэдна. Адзіны спосаб для кантролера, каб паказаць абнаўленне адбываецца праз eUpdateZip струмень у межах структуры дадзеных кантролера.

Multiple controllers are assembled into a graph, which is just a list of Controllers placed in an existential type wrapper data EControl = forall st. EControl (Controller st). I just mconcat all of the individual eUpdateZip parameters to get a single stream of Event (MyDataZip -> MyDataZip) which is used to create the Discrete MyDataZip. The whole thing works because creating new controllers is pure, so it can be done in the same let-binding, allowing the recursive reference.

Адкрыццё новых вокнаў і іншых задач ўводу-вываду выконваюцца ў eResponse патоку, які аналагічна mconcat d, а затым перадаецца ў reactimate .

Вы можаце праглядзець Darcs РЭПО для атрымання больш падрабязнай інфармацыі, глядзіце ў «SRC/Jaek/UI/Кантролеры/"і" SRC/Jaek/ПІ/ControlGraph.hs ".

EDIT: Галоўная праблема складаецца ў тым, што адна вялікі сетка даволі грувасткая ад POV распрацоўніка. Вы можаце паменшыць складанасць шляхам сегментаванне сетак, што з'яўляецца добрым рашэннем. У маёй канструкцыі, я ўвёў шмат структуры сеткі шляхам рэакцыйна ўдзельнікі адпавядаюць пэўнай мадэлі кантролера, а таксама стварэнне добра пэўныя сродкі для гэтых мадэляў, каб ўзаемадзейнічаць. Паколькі мае кантралёры з'яўляюцца пастаяннымі, што ўсе створаныя статычны, але гэта можа быць зроблена дынамічна, у гэтым выпадку я б, верагодна, менеджэр кантролера працуе ў адным патоку, а таксама дзеянні, якія генерыравалі новыя кантралёры (напрыклад, адкрыццё новага акна) будуць адправіць паведамленне ў тэму, каб стварыць новы кантролер.

3
дададзена

На дадзены момант, не ўяўляецца магчымым, каб дадаць або выдаліць знешнія падзеі да сеткі падзеі пасля таго, як яна была сабрана (па стане на рэактыўна-бананавы версіі 0.4.3). Іншымі словамі, гэта немагчыма апісаць вашу задачу ў адной сеткі падзей. Тым не менш, вы можаце выкарыстоўваць знешнія падзеі або некалькіх сетак падзей, што прыводзіць да рашэнняў, як наступнае:

  • Карта дынамічную калекцыю вокнаў статычнага набору крыніц падзей (ака AddHandler рэчы).
  • Ці выкарыстоўваць адну сетку падзей у акно і зрабіць іх мець зносіны з дапамогай знешніх крыніц падзей.
  • Ці перакампіляваць ў адной сеткі падзея кожны раз, калі новае акно дадаецца або выдаляецца. На жаль, ўнутраны стан будзе страчана, так што вы павінны зрабіць гэта відавочна і захапіць яго звонку (напрыклад, у IORef ). (Гэта, верагодна, найменш здавальняючы рашэнне.)
1
дададзена
@ocharles Так, зараз гэта магчыма з дынамічным пераключэннем падзей. <Код> BarTab.hs прыклад дэманструе падобную сітуацыю, хоць і не з пераменным колькасцю вокнаў, але з пераменным лікам ўваходных тэкставых боксаў.
дададзена аўтар Heinrich Apfelmus, крыніца
Ці з'яўляецца гісторыя ў той жа рэакцыйна-банан 0.8? Цяпер, калі мы маем Execute і сябры, мне цікава, калі гэта зараз можна зрабіць гэта ў больш чыстай форме.
дададзена аўтар ocharles, крыніца