Closed tristanbuckner closed 8 years ago
You're going to need to minimize this if you want someone to take a look and be able to understand what's happening =)
Fair enough :) Here it is without the helper functions:
import scalatags.JsDom.all._
import utest._
import utest.framework.Test
import utest.util.Tree
object MinimizedSuite extends TestSuite {
override def tests: Tree[Test] = TestSuite {
'JoinTest {
val renderedSep = div("sep").render
val divsRendered = List(
div("content1").render,
renderedSep,
div("content2").render,
renderedSep,
div("content3").render
)
val unrenderedSep = div("sep")
val divsUnrendered = List(
div("content1"),
unrenderedSep,
div("content2"),
unrenderedSep,
div("content3")
)
val renderedDivs = div(divsRendered).render.outerHTML
val unrenderedDivs = div(divsUnrendered).render.outerHTML
assert(renderedDivs == unrenderedDivs)
}
}
}
For some reason only the last rendered separator is visible.
utest.AssertionError: assert(renderedDivs == unrenderedDivs)
renderedDivs: String = <div><div>content1</div><div>content2</div><div>sep</div><div>content3</div></div>
unrenderedDivs: String = <div><div>content1</div><div>sep</div><div>content2</div><div>sep</div><div>content3</div></div>
If you change the vals to defs it works, so I gather render must be stateful and the tag mutable. Is this expected and documented behavior?
Ah yes, render results in a single stateful, mutable tag. This isn't explicitly called out, but is demonstrated in the examples. e.g. http://lihaoyi.github.io/scalatags/#UsingtheDOM
val elem = div.render
assert(elem.children.length == 0)
elem.appendChild(p(1, "wtf", "bbq").render)
assert(elem.children.length == 1)
val pElem = elem.children(0).asInstanceOf[Paragraph]
assert(pElem.childNodes.length == 3)
assert(pElem.textContent == "1wtfbbq")
The fact that I can append stuff to it, or call standard DOM apis on it, suggests that they're normal mutable DOM nodes. And normal mutable DOM nodes, if inserted into the DOM multiple times, behave weirdly.
Kinda odd, but that's the DOM for ya
I was attempting to use a helper method I wrote for inserting a separator between tags which worked fine until I needed the rendered element to pass into JQuery (dom.Element instead of TypedTag[dom.Element]). Although no errors are thrown only the last separator is rendered. Here is a test case showing what I'm talking about.
Here's everything that might be in the classpath for the client: