karax/experiments/refs/demo.nim
2017-06-18 18:01:48 +02:00

58 lines
1.2 KiB
Nim

include karaxprelude
import future, sequtils
type
CustomRef = ref object of VComponent
method onAttach(r: CustomRef) =
kout(cstring"custom ref attached")
method onDetach(r: CustomRef) =
kout(cstring"custom ref detached")
var
modelData = @[5, 2, 4]
refA = VComponent()
refB = VComponent()
refC = CustomRef()
refSeq = newSeq[VComponent]()
proc onClick(ev: Event, n: VNode) =
modelData.add(0)
proc showRefs() =
kout(refA)
kout(refB)
kout(refC)
for i in 0 ..< refSeq.len:
kout(refSeq[i].vnode)
#kout(refSeq.map(nref => nref.vnode))
proc secureRefSlot(i: int): VComponent =
while refSeq.len <= i:
refSeq.add(VComponent())
result = refSeq[i]
proc view(): VNode =
result = buildHtml():
tdiv:
button(onclick=onClick):
text "click me"
# storing refs to single elements is straightforward now
if modelData.len mod 2 == 0:
tdiv(nref=refA):
text "A"
tdiv(nref=refB):
text "B"
tdiv(nref=refC):
text "C"
# It's a bit more tricky when containers are involved:
for i, x in modelData.pairs:
tdiv(nref=secureRefSlot(i)):
text "List item: " & $x
proc renderer(): VNode =
view()
setRenderer(renderer, "ROOT", showRefs)