如何在客户端结婚 scalajs-react 和自动装配?
How to married scalajs-react and autowire on a client side?
我无法将自动装配调用与 scalajs-react 组件混合使用。这是一个使用 scalajs-react v0.10.0
+ autowire v0.2.5
的简单示例
case class User(name: String)
class Backend($: BackendScope[Unit, User]) {
def mounted: Callback = {
val future: Future[User] = AjaxClient[Api].getUser(123).call()
//FIXME: how to get deal with it?
CallbackTo { future.foreach(user => $.modState(_ => user)) }
}
}
val Main = ReactComponentB[Unit]("Main")
.initialState(User("N/A"))
.backend(new Backend(_))
.render { $ =>
val name = $.state.name
<.p(s"User name is $name")
}
.componentDidMount(_.backend.mounted)
.buildU
状态修改在这里不起作用。如何合并 Future
和 Callback
?
更新 (27/10/15)
我的自动装配客户端
package example
import scalajs.concurrent.JSExecutionContext.Implicits.runNow
import org.scalajs.dom
import upickle._
import default._
import scala.concurrent.Future
object AjaxClient extends autowire.Client[Js.Value, Reader, Writer] {
def write[Result: Writer](r: Result) = default.writeJs(r)
def read[Result: Reader](p: Js.Value) = default.readJs[Result](p)
override def doCall(req: Request): Future[Js.Value] = {
println(req)
dom.ext.Ajax.post(
url = "/api/autowire/" + req.path.mkString("/"),
headers = Map("Content-Type" -> "application/json"),
data = json.write(Js.Obj(req.args.toSeq :_*))
).map(_.responseText)
.map{t => println(t); t}
.map(json.read)
}
}
添加一些方法来简化 Callback
+Future
的组合可能会很有帮助。请随意提交 PR,甚至提出一个问题,展示额外支持可能有用的示例。
在这样的助手存在之前,您可以像这样在 future 中调用 .runNow()
:
Callback(future.foreach($.setState(_).runNow()))
我无法将自动装配调用与 scalajs-react 组件混合使用。这是一个使用 scalajs-react v0.10.0
+ autowire v0.2.5
case class User(name: String)
class Backend($: BackendScope[Unit, User]) {
def mounted: Callback = {
val future: Future[User] = AjaxClient[Api].getUser(123).call()
//FIXME: how to get deal with it?
CallbackTo { future.foreach(user => $.modState(_ => user)) }
}
}
val Main = ReactComponentB[Unit]("Main")
.initialState(User("N/A"))
.backend(new Backend(_))
.render { $ =>
val name = $.state.name
<.p(s"User name is $name")
}
.componentDidMount(_.backend.mounted)
.buildU
状态修改在这里不起作用。如何合并 Future
和 Callback
?
更新 (27/10/15)
我的自动装配客户端
package example
import scalajs.concurrent.JSExecutionContext.Implicits.runNow
import org.scalajs.dom
import upickle._
import default._
import scala.concurrent.Future
object AjaxClient extends autowire.Client[Js.Value, Reader, Writer] {
def write[Result: Writer](r: Result) = default.writeJs(r)
def read[Result: Reader](p: Js.Value) = default.readJs[Result](p)
override def doCall(req: Request): Future[Js.Value] = {
println(req)
dom.ext.Ajax.post(
url = "/api/autowire/" + req.path.mkString("/"),
headers = Map("Content-Type" -> "application/json"),
data = json.write(Js.Obj(req.args.toSeq :_*))
).map(_.responseText)
.map{t => println(t); t}
.map(json.read)
}
}
添加一些方法来简化 Callback
+Future
的组合可能会很有帮助。请随意提交 PR,甚至提出一个问题,展示额外支持可能有用的示例。
在这样的助手存在之前,您可以像这样在 future 中调用 .runNow()
:
Callback(future.foreach($.setState(_).runNow()))