Liftweb - 多个ValueCell状态更改

时间:2012-01-20 12:42:26

标签: scala functional-programming cell lift

在我的应用程序中,我使用了一些“数据”ValueCell(类似于20),我想创建一个ValueCell,用于检测我的“数据”是否{{1} {{ 1}}已更新。因此,每当其他一个单元格发生变化时,我希望这个单元格能够改变。

这是一个简单的代码示例

ValueCell

我应该放什么代替class StringFilter { val referenceList = "foo"::"bar"::"scala"::"lift"::Nil val length = ValueCell[Int](3) val content = ValueCell[String]("") //Here I put some functions to update length or prefix on my webpage def filter(s:String):Boolean = (s.length==length.get)&&(s.contains(content.get)) val changed =ValueCell[???](???) val results= changed.lift(referenceList.filter) } ?我也对不使用ValueCells的解决方案持开放态度,即使我最终需要一些单元格,因为我必须使用WiringUI。

修改: ???length不需要是单元格,但需要设置

编辑经过一些更多的研究后,我提出了一个想法:实现一个content,如case class但不会为参数中的单元格采用类型,并且任意数量的细胞。有可能吗?
以下是SeqCell的实现:

SeqCell

修改:在scala中final case class SeqCell[T](cells: Cell[T]*) extends Cell[Seq[T]] { cells.foreach(_.addDependent(this)) /** * The cell's value and most recent change time */ def currentValue: (Seq[T], Long) = { val tcv = cells.map(_.currentValue) tcv.map(_._1) -> tcv.foldLeft(0L)((max, c) => if (max > c._2) max else c._2) } /** * If the predicate cell changes, the Dependent will be notified */ def predicateChanged(which: Cell[_]): Unit = notifyDependents() } 不是covariant,因此我似乎无法从我的多重输入中生成Cell细胞。我真的很感激任意数量的细胞的全局解决方案。

1 个答案:

答案 0 :(得分:1)

结帐FuncCell。它只是另一个细胞,它将确定其作为一个或多个其他细胞的函数的价值。我给出的链接是伴随对象,它对1-5个单元格应用方法,对应于现有的FuncCell1 .. FuncCell5实现。当其中一个单元格改变值时,FuncCell将更新其自己的值 - 然后您将WiringUI与您的FuncCell挂钩。

请原谅任何语法错误,我没有打开IDE来检查自己...

val changed: Cell[List[String]] = FuncCell(length, content){(len,con) =>
  def filter(s: String) = (s.length == len) && (s.contains(con))
  referenceList.filter(filter _)
}

如果这是正确的,那么changed现在是Cell,其值将反映调用referenceList.filter的结果


在回复您对SeqCell的修改时,我可以想到两个解决方案:

1)使用Any作为SeqCell

中的类型参数
val cell1: ValueCell[Int] = ...
val cell2: ValueCell[String] = ...
val cell3: ValueCell[Stuff] = ...
...
val combined: SeqCell[Any] = SeqCell(cell1, cell2, cell3, ...)
val results = FuncCell(combined){ seq: Seq[Any] => ... }

2)将中间单元组合成元组,以便您可以使用现有的FuncCell实现。

val intermediate1: Cell[(Int,String)] = 
  FuncCell(cell1,cell2){(a:Int, b:String) => a -> b}
val results = 
  FuncCell(intermediate1, cell3){(i: (Int, String), s: Stuff) => ...}