在我的应用程序中,我使用了一些“数据”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
细胞。我真的很感激任意数量的细胞的全局解决方案。
答案 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) => ...}