使用它时,“破坏”purescript-卤素成分的最佳方法是什么?

时间:2017-04-16 21:26:12

标签: lifecycle purescript halogen

我正在使用卤素来控制我的应用程序的菜单系统,我想知道如何“破坏”卤素组件。现在,我有一个函数,在具有特定ID的div上创建子菜单组件。在应用程序的整个生命周期中,子菜单可以多次访问,因此,只要调用visitSubMenu函数,就会创建组件的多个实例。

import Halogen.Aff as HA
import Halogen.VDom.Driver (runUI)

visitSubMenu = do
  elem <- HA.selectElement "#submenu"
  case elem of
    (Just element) -> do
      liftEff $ HA.runHalogenAff do
        io <- runUI subMenuComponent unit element
        -- other code using component io...

理想情况下,当用户完成子菜单中的工作时,我希望删除子菜单组件(即删除注入#submenu的HTML,进行其他清理)。这种事情有可能吗?我意识到我可以在应用程序启动时只设置一次组件,并在应用程序的整个生命周期中保持活动状态,但如果我只在需要时设置它,对我来说似乎更好。

我怀疑这是正确的方法,但我最初的想法是我可以创建一个lifecycleComponent,当我想要销毁它时,我可以发送Finalize查询然后手动删除父元素来自DOM。

1 个答案:

答案 0 :(得分:1)

最后,我发现的唯一解决方案是向组件发送“清理”查询,然后删除卤素组件的根DOM元素。

<强> FFI

exports.removeElementById = function(id) {
  return function() {
    var e = document.getElementById(id);
    if (e) e.remove();  
  }
}

卤素组件模块

foreign import removeElementById :: String -> Eff (dom :: DOM | e) Unit

removeSelf :: forall e. Aff (dom :: DOM | e) Unit
removeSelf = liftEff $ removeElementById componentId

componentId :: String
componentId = "unique-id-for-component"

render :: State -> H.ComponentHTML Query
render state = HH.div [HP.id_ componentId] []

然后,当我使用完该组件后,我可以调用removeSelf