【问题标题】:Use an array as bindable variable in Binding.scala在 Binding.scala 中使用数组作为可绑定变量
【发布时间】:2018-08-13 15:05:26
【问题描述】:

我的案例类中数据字段的参数数量是动态变化的。

那么,Var 也可以在 Binding.scala 中绑定 js.Array 吗?

我尝试了以下代码但没有成功:

case class Data(d: Var[js.Array[String]])
val data = Vars.empty[Data]

{
  for (x <- data) yield {
    val y: js.Array[String] = x.d.bind
    y.zipWithIndex.foreach{case (v, i) => <th>{ y(i) }</th>}
  }
}

【问题讨论】:

  • 为什么不直接使用Vars[String]
  • 其实Vars[String]中的内部缓存是JS后端的js.Array

标签: binding.scala


【解决方案1】:

我可以把它带到ScalaFiddle 上工作。

本质上,您必须将每个数组或选项放在一个常量对象中,例如:

  @dom
  def render = {
      val bindData= data.bind
      <div>
        {Constants(bindData: _*)
           .map(a => dataElem(a))
           .map(_.bind)}
      </div>
    }

应该有:

  1. 绑定数据:val bindData= data.bind
  2. Put 元素:&lt;div&gt;Put
  3. 常量构造函数中的数组:Constants(bindData: _*)
  4. 使用每个数据元素调用元素:.map(a =&gt; dataElem(a))
  5. 绑定每个结果:.map(_.bind)

所以你一层一层往下走。

【讨论】:

    【解决方案2】:

    来自Binding.scala: Strategy to avoid too many dom-tree updates,不得不提一下,与理解相比,直接绑定在 Vars 上的速度很慢。

    您应该始终在 Vars 上使用 for comprehension,除非您正在执行一些必须对整个列表起作用的聚合。

    对于您的示例,我创建了一个更新的 ScalaFiddle:https://scalafiddle.io/sf/7lCiigL/0

    【讨论】:

      猜你喜欢
      • 2020-09-18
      • 2014-01-20
      • 2018-01-30
      • 2018-10-26
      • 2020-09-18
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多