diff options
author | Li Haoyi <haoyi@dropbox.com> | 2014-11-20 02:07:02 -0800 |
---|---|---|
committer | Li Haoyi <haoyi@dropbox.com> | 2014-11-20 02:07:02 -0800 |
commit | 7ca2e125c17bd541340bce55623bd40cf88ce64f (patch) | |
tree | 9d79964209255e539fa83275466f9ea32c01db8d /examples/demos/src/main/scala/advanced/BasicRx.scala | |
parent | efc1b9cfd9c04b8d7f8cf0fb35e77bcb94a25a6e (diff) | |
download | hands-on-scala-js-7ca2e125c17bd541340bce55623bd40cf88ce64f.tar.gz hands-on-scala-js-7ca2e125c17bd541340bce55623bd40cf88ce64f.tar.bz2 hands-on-scala-js-7ca2e125c17bd541340bce55623bd40cf88ce64f.zip |
Scala-async chapter works
Diffstat (limited to 'examples/demos/src/main/scala/advanced/BasicRx.scala')
-rw-r--r-- | examples/demos/src/main/scala/advanced/BasicRx.scala | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/examples/demos/src/main/scala/advanced/BasicRx.scala b/examples/demos/src/main/scala/advanced/BasicRx.scala new file mode 100644 index 0000000..56b41b0 --- /dev/null +++ b/examples/demos/src/main/scala/advanced/BasicRx.scala @@ -0,0 +1,80 @@ +package advanced + +import org.scalajs.dom +import scala.scalajs.js +import scala.scalajs.js.annotation.JSExport +import rx._ +import scalatags.JsDom.all._ + +@JSExport +object BasicRx { + @JSExport + def main(container: dom.HTMLDivElement) = { + val txt = Var("") + val numChars = Rx{txt().length} + val numWords = Rx{ + txt().split(' ') + .filter(_.length > 0) + .length + } + + val avgWordLength = Rx{ + txt().count(_ != ' ') * 1.0 / numWords() + } + + val txtInput = textarea.render + txtInput.onkeyup = (e: dom.Event) => { + txt() = txtInput.value + } + + container.appendChild( + div( + txtInput, + ul( + li("Chars: ", numChars), + li("Words: ", numWords), + li("Word Length: ", avgWordLength) + ) + ).render + ) + } + @JSExport + def main2(container: dom.HTMLDivElement) = { + val fruits = Seq( + "Apple", "Apricot", "Banana", "Cherry", + "Mango", "Mangosteen", "Mandarin", + "Grape", "Grapefruit", "Guava" + ) + val query = Var("") + val txtInput = input.render + txtInput.onkeyup = (e: dom.Event) => { + query() = txtInput.value + } + + val fragments = + for(fruit <- fruits) yield Rx { + val shown = fruit.toLowerCase + .startsWith(query()) + if (shown) li(fruit) + else li(display := "none") + } + + container.appendChild( + div( + txtInput, + ul(fragments) + ).render + ) + } + implicit def rxFrag[T <% Frag](r: Rx[T]): Frag = { + def rSafe: dom.Node = span(r()).render + var last = rSafe + Obs(r, skipInitial = true){ + val newLast = rSafe + js.Dynamic.global.last = last + last.parentNode.replaceChild(newLast, last) + last = newLast + } + last + } +} |