使用Binding.scala时,出现错误“每条指令必须在SDE块内”,我该如何解决?

Yan*_* Bo 3 data-binding dom scala web-frontend binding.scala

当我使用Binding.scala时,我想div根据源数据创建一些someCollection

val someCollection = Seq("foo", "bar")
someCollection.map { item =>
  <div>{item.bind}</div>
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了编译器错误each instructions must be inside a SDE block

我怎样才能解决这个问题?

Yan*_* Bo 6

导致此错误的代码是您的bind表达式不能在@dom宏范围之外。创建闭包时可能发生这种情况,可以通过以下方法解决:

  1. 将闭包中的代码重构为自己的带@dom注释的方法。
  2. 转换someCollectionBindingSeq,例如:

    Constants(someCollection: _*).map { item => <div>{item.bind}</div> }

  3. 提供scalaz.Traverse集合的类型类(在ScalaFiddle上运行此示例

TL; DR

@dom def renderList(data: List[Binding[String]]) = <ol>{
  import scalaz.std.list._ // Type classes for List
  for (b <- data) yield {
    <li>{b.bind}</li>
  }
}</ol>
Run Code Online (Sandbox Code Playgroud)