type
Selector = ref object
selected: kstring
...
proc onClickButton(e: Event, n: VNode, state: Selector) =
var newElement = document.createElement(state.selected)
var container = document.getElementById("elementContainer")
newElement.id = state.selected & "-element"
container.replaceChild(newElement, container.firstChild)
This works as expected, but it throws the following exeption leaving karax unstable:
Error: Error: unhandled exception: /home/pit/.nimble/pkgs/karax-1.1.0/karax/karax.nim(620, 14) `same(kxi.currentTree, document.getElementById(kxi.rootId))` Traceback (most recent call last) redraw.:anonymous, line: 659 karax.dodraw, line: 620 assertions.failedAssertImpl, line: 27 assertions.raiseAssert, line: 20 sysFatal.sysFatal, line: 39
The previous approach didn't convince me so i tried using karax only functions (showing my karax noobness):
proc onClickButton(e: Event, n: VNode, state: Selector) =
var nel = tree(parseEnum[VNodeKind]($state.selected))
nel.setAttr("id", state.selected & "-element")
var cont = getVNodeById("elementContainer")
cont.delete(0)
cont.add(nel)
redrawSync()
Which didn't work at all.
I also tried using the following renderer with no results:
proc renderElement(e: kstring): VNode =
var element = tree(parseEnum[VNodeKind]($e))
element.setAttr("id", e & "-element")
result = buildHtml(tdiv):
element
...
proc render*(selector: Selector): VNode =
result = buildHtml(tdiv):
h1(text "Select an element, then press Create")
renderSelectorList(selector)
renderButton("Create", selector)
tdiv(id="elementContainer", text "Placeholder"):
if selector.selected.len == 0:
text "Placeholder"
else:
renderElement selector.selected
Is there a proper approach to append/replace elements using just karax?
You have an example in the repo's Readme: https://github.com/pragmagic/karax#event-model
Basically use for
var
prev: VNodeKind
selected: VNodeKind
proc renderElementList*: VNode =
result = buildHtml(tdiv):
select(id="selector"):
proc onchange(e: Event, n: VNode) =
prev = parseEnum[VNodeKind]($n.value)
for element in low(VNodeKind) .. high(VNodeKind):
option(value = $element):
text $element
proc renderElement*(kind: VNodeKind): VNode =
result = buildHtml(newVNode(kind))
proc renderCreator*: VNode =
result = buildHtml(tdiv):
renderElementList()
button:
text "Create"
proc onclick(e: Event, n: VNode) =
selected = prev
echo $selected, " created"
button:
text "Edit"
proc onclick(e: Event, n: VNode) =
echo "Editing ", $selected
tdiv:
renderElement(selected)
This solution is not genius but it does the job.