scalajs反应路由器。如何在条件路由中执行ajax请求
我正在尝试一些有条件的路线。该条件在服务器端解决。scalajs反应路由器。如何在条件路由中执行ajax请求,scala,routing,scala.js,scalajs-react,Scala,Routing,Scala.js,Scalajs React,我正在尝试一些有条件的路线。该条件在服务器端解决。 路由规则示例: | (dynamicRouteCT("#user" / long.caseClass[User]) ~> dynRender((page: User) => <.div("Hello, " + page.id.toString))) .addCondition((page: User) => checkPermissions(page.id))(_ => Some(redirectToPage(
路由规则示例:
| (dynamicRouteCT("#user" / long.caseClass[User]) ~> dynRender((page: User) => <.div("Hello, " + page.id.toString)))
.addCondition((page: User) => checkPermissions(page.id))(_ => Some(redirectToPage(Page403)(Redirect.Push)))
我发现这里的类型不匹配:(page:User)=>checkPermissions(page.id)
是否可以在条件路由内执行ajax请求?如果我们查看
def addCondition(cond:Page=>CallbackTo[Boolean])(condemet:Page=>Option[Action[Page]]):Rule[Page]
我们可以看到它需要CallbackTo[Boolean]
。由于JS环境的性质,现在有一条路要走,从Future[A]
到A
。虽然这不是scalajs react本身的限制,但它是一个继承的现实,将影响您的scalajs react代码;如图所示,从CallbackTo[Future[Boolean]
到CallbackTo[Boolean]
是不可能的
这种类型级别的限制对于用户体验来说确实是一件好事。路由器是同步的,它必须确定如何立即呈现路由和路由更改。如果允许它是异步的,并且在某种程度上支持Future
s,那么用户将在没有任何视觉反馈或中断方式的情况下体验到明显的(潜在的巨大)延迟
解决这个问题的“正确方法”是使用覆盖异步状态的模型。这就是我要做的:
异步状态[E,A]
ADT,其大小写为:空
,等待响应
,加载(值:A)
,失败(错误:E)
,如果需要,您可以进一步丰富这些内容,例如加载
时的加载时间,在失败
时重试回调,在等待响应
时开始的时间等。)AsyncState[Boolean]
实例(路由器不会知道该值,因为它是动态的,请在a中使用
回调
,以便于理解,从而连接并满足类型要求。)AsyncState[Boolean]
的值,呈现对用户有意义的内容。如果是等待应答
,则显示一个小微调器;如果失败,则显示一个错误,可能还有一个重试按钮AsyncState[Boolean]
实际上不应该是Boolean
,因为这对域来说不是非常描述性或真实的。它可能是更有意义的东西,比如AsyncState[UserAccess]
或类似的东西。)
希望有帮助!祝你好运
def checkPermissions(id: Long) = CallbackTo.future{
/*Ajax.get(s"http://some.uri/?id=$id") map (res =>
* if (something) true
* else false
* )
*/
//the request before returns Future[XMLHttprequest] witch maps to Future[Boolean]
Future(false)
}