Why is the Binding.scala router not reevaluated?

99封情书 提交于 2019-12-24 04:43:12

问题


I'm trying to build a generic router for a personal project by Binding.scala.

I've defined a PageState trait

sealed trait WhistState {
  def text: String
  def hash: String

  def render: Binding[Node]
}

with a number of subclasses for each route type. I've then trying to create a router, which based on the hash chooses the correct class.

object Router {

  val defaultState: WhistState = DefaultState("Games")

  val allStates: Vector[WhistState] = Vector(defaultState)


  val route: Route.Hash[WhistState] = Route.Hash[WhistState](defaultState)(new Route.Format[WhistState] {

    override def unapply(hashText: String): Option[WhistState] = allStates.find(_.hash == window.location.hash)
    override def apply(state: WhistState): String = state.hash

  })

  route.watch()

}

And then I'm my application classes im trying to use this

object Application {
  import example.route.Router._

  @dom
  def render: Binding[Node] = {
    for (hash <- route.state.bind.hash) yield println("hash: " + hash)

    route.state.bind match {
      case default: WhistState => println("default"); default.render.bind
      case _                   => println("none");    <div>NotFound</div>
    }
  }

  def main(args: Array[String]): Unit = {
    dom.render(document.querySelector("#content"), render)
  }

}

I've would expect that changing the hash would force a reevaluation of route.state.bind match ... expression.

Any idea to why this doesn't work?

Best regards


回答1:


route.state is only changed when unapply returns a Some(newState) and newState does not equal to the previous state.

In your case, unapply always returns Some(defaultState) or None. That's why route.state never changes.



来源:https://stackoverflow.com/questions/47451630/why-is-the-binding-scala-router-not-reevaluated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!