Перенаправление маршрута Binding.scala на страницу входа - PullRequest
0 голосов
/ 25 июня 2018

Я хотел бы добавить «охранников» к определенным URL.Эти URL должны быть доступны только когда пользователь вошел в систему. Если я не вошел в систему, я хочу перенаправить пользователя на страницу входа.После успешного входа в систему я хочу, чтобы пользователь был «перенаправлен» на исходный хеш.

Это мой маршрутизатор

@dom
def outlet: Binding[Node] = {
    <div>{
    route.state.bind match {
        case s: View if UserService.hasRole("admin") => s.render.bind
        case s  if !UserService.isLoggedIn() => loginPage.render(Some(s.hash)).bind
        case _ => <div>Unknown</div>
    }
    }</div> 

loginPage затем меняет хеш окна после успешного входа:

def login(username: String, password:String, orginalHash: Option[String]) =
    UserService.login(username,password).andThen{
        case Success(v) =>
            println(s"changing hash to $orginalHash")
            orginalHash.map(_.substring(1)).foreach(window.location.hash=_)
        case Failure(e) => message.value = "Wrong username/password"
    }

Тем не менее, я думаю, потому что хэш фактически не изменяется, он не обновляет страницу:

  • Скажем, я перехожу на /index.html/#/foobar
  • Включается «охранник» и отображается страница входа (URL остается /index.html/#/foobar)
  • Значение orginalHash равно #/foobar
  • , изменяя location.hash на /foobar ничего не делает

Есть ли способ манипулировать роутером.Возможно, есть API для изменения текущей страницы?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Благодаря указаниям @ yang-bo я решил эту проблему, используя val user: Var[Option[User]] внутри UserService и изменив соответствие шаблона на

@dom
def outlet: Binding[Node] = {
    <div>{
        (route.state.bind, UserService.user.bind) match {
        case (s: View, Some(_))  => s.render.bind
        case (s, None) => loginPage.render(Some(s.hash)).bind
        case (_,_) => <div>Unknown</div>
    }
    }</div>
}
0 голосов
/ 26 июня 2018

Вы создаете приложение для привязки данных, однако некоторые изменяемые состояния не могут быть привязаны в вашей системе.

Вы должны сделать UserService.isLoggedIn и UserService.hasRole("admin") связываемыми.

...