私のアプリケーションでは、いくつかの "データ" ValueCell
(20のようなもの)を使用しています。ValueCell
が更新されたかどうかを検出するために使用されるValueCell
を作成したいと思います。だから私は、このセルが、他のセルの1つが変更されるたびに変更したいと思います。ここでLiftweb - 複数の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)
}
のですか? WiringUIを使用する必要があるため、最終的にいくつかのセルが必要になっても、ValueCellを使用していないソリューションにもオープンしています。
編集:length
とcontent
は細胞である必要はありませんが、彼らは設定可能
を編集する必要があります。いくつかのより多くの研究の後、私はアイデアに来た:SeqCell
ようcase class
を実装するが、これだろうパラメータのCells、および任意の数のセルに対して型を取らないでください。出来ますか?
はここSeqCell
の実装です:
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()
}
編集:ScalaのCell
でがcovariantではないので、私は私の複数のタイプされた細胞のうち、SeqCell
を作ることができなくなりますようにそれはそう。私は本当に任意の数の細胞のためのグローバルな解決に感謝します。
あなたのソリューションに感謝しますが、私はこのソリューションを任意の数のセルで使用することはできませんでしたが、SeqCell(cells:Cell [T] *)私はそれをどのように使うのかわかりません(実際に '*'が何を意味するのかわかりませんし、検索エンジンでチェックするのが難しいので) –
'*'はあなたができることを意味します'cells'引数の代わりにカンマ区切りの任意の数の引数を入力します。私はあなたが "varArgs"でより良い検索結果を得るかもしれないと思います。 'SeqCell'の限界は、各セルが同じタイプ(' T')でなければならないということです。それは少し汚いかもしれませんが、あなたはいつでも引数をタプルのセルに凝縮できます。例えば。あなたがCell [A]とCell [B]を持っていれば、それらを 'FuncCell(aCell、bCell){(a、b)=> a-> b}'と組み合わせることができます。 – Dylan
これは、私は自分の問題を解決することができます。しかし、私はあなたが "varArgs"とは何を意味するのか理解していない。あなたは私に例を挙げることができますか? –