2016-03-02 76 views
3

我尝试了scala.js示例https://github.com/lihaoyi/hands-on-scala-js及其带有scalatags的scala.rx,它是高级部分的一部分。 示例编译是运行正常,但是当我尝试使用最新的scala.rx v 0.3.1我获得以下编译错误:Scala.Rx with ScalaTags示例编译错误

[info] Compiling 19 Scala sources to /home/code/workspace/hands-on-scala-js-master/examples/demos/target/scala-2.11/classes... 
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:14: 
[error] This Rx might leak! Either explicitly mark it unsafe (Rx.unsafe) or make an implicit RxCtx available 
[error] in the enclosing scope, for example, by adding (implicit ctx: Ctx.Owner) to line 12: method main 
[error]  val numChars = Rx{txt().length} 
[error]     ^
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:15: 
[error] This Rx might leak! Either explicitly mark it unsafe (Rx.unsafe) or make an implicit RxCtx available 
[error] in the enclosing scope, for example, by adding (implicit ctx: Ctx.Owner) to line 12: method main 
[error]  val numWords = Rx{ 
[error]     ^
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:55: 
[error] This Rx might leak! Either explicitly mark it unsafe (Rx.unsafe) or make an implicit RxCtx available 
[error] in the enclosing scope, for example, by adding (implicit ctx: Ctx.Owner) to line 42: method main2 
[error]  for(fruit <- fruits) yield Rx { 
[error]         ^
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:65: diverging implicit expansion for type Nothing => scalatags.JsDom.Frag 
[error] starting with method rxFrag in object BasicRx 
[error]   ul(fragments) 
[error]   ^
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:72: not found: value Obs 
[error]  Obs(r, skipInitial = true){ 
[error] ^
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:72: not found: value skipInitial 
[error]  Obs(r, skipInitial = true){ 
[error]   ^
[warn] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/webpage/WeatherSearch.scala:53: non-variable type argument scala.scalajs.js.Dynamic in type pattern scala.scalajs.js.Array[scala.scalajs.js.Dynamic] is unchecked since it is eliminated by erasure 
[warn]   case jsonlist: js.Array[js.Dynamic] => 
[warn]       ^
[warn] one warning found 
[error] 6 errors found 
[error] (demos/compile:compile) Compilation failed 

似乎所有权概念已经以某种方式改变,也没有观测数据同伴对象。

我试着把这些BasicRx.scala误差修改: 旧代码:

@JSExport 
def main(container: html.Div) = { 

新代码(漏修复):

@JSExport 
def main(container: html.Div) = { 
    implicit val ctx: Ctx.Owner = Ctx.Owner.safe() 

旧代码:

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 
    } 

新代码(转换修复程序):

implicit def rxFrag[T <% Frag](r: Rx[T]): Frag = { 
    def rSafe: dom.Node = span(r()).render 
    var last = rSafe 

    val thunk =() => { 
     val newLast = rSafe 
     js.Dynamic.global.last = last 
     last.parentNode.replaceChild(newLast, last) 
     last = newLast 
    } 
    new Obs(thunk, r) 
    last 
    } 

但仍得到以下错误:

[info] Compiling 19 Scala sources to /home/code/workspace/hands-on-scala-js-master/examples/demos/target/scala-2.11/classes... 
[warn] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/webpage/WeatherSearch.scala:53: non-variable type argument scala.scalajs.js.Dynamic in type pattern scala.scalajs.js.Array[scala.scalajs.js.Dynamic] is unchecked since it is eliminated by erasure 
[warn]   case jsonlist: js.Array[js.Dynamic] => 
[warn]       ^
[error] /home/code/workspace/hands-on-scala-js-master/examples/demos/src/main/scala/advanced/BasicRx.scala:74: No implicit Ctx.Data is available here! 
[error]  def rSafe: dom.Node = span(r()).render 
[error]        ^

如何解决这个问题呢? 并正确完成泄漏修复?

将scalatags更新为0.5.4。没有任何影响。

回答

4

我帮助了scala.rx的0.3.x分支 - 而且是的,api在很大程度上是从0.2.x开始改变的。不过,我也保持更近的“框架”代码版本你在看这里:

https://github.com/Voltir/framework.rx/blob/master/src/main/scala/framework/Framework.scala

而且,事实证明,在使用js.App及其def main(),正确的情况下,获得Ctx.Owner的方法是使用import rx.Ctx.Owner.Unsafe._。只要该主要功能的评估次数为每页负载的有限次数(即一次),则允许“泄漏”是安全的。您的Ctx.Owner.safe()的使用不会起作用,因为编译器无法证明main仅被称为有限次数。

这一切的一个完整的例子可以在这个库中的演示项目中找到: https://github.com/Voltir/route.rx

+0

或者我究竟在做什么,我有Ctx.Owner.unsafe上面提到的例子: 的https:/ /github.com/Voltir/form.rx-demo/blob/master/src/main/scala/example/ScalaJSExample.scala#L464 – Voltaire