summaryrefslogtreecommitdiff
path: root/examples/demos/src/main/scala/advanced/BasicRx.scala
diff options
context:
space:
mode:
Diffstat (limited to 'examples/demos/src/main/scala/advanced/BasicRx.scala')
-rw-r--r--examples/demos/src/main/scala/advanced/BasicRx.scala80
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
+ }
+}