2012-01-20 1 views
2

내 응용 프로그램에서 일부 "데이터"ValueCell (20과 비슷한)을 사용하고 ValueCell을 만들어 내 "데이터"가 ValueCell 인 경우 검색하는 데 사용하고 싶습니다. 그래서 다른 셀 중 하나가 변경 될 때마다이 셀을 변경하고 싶습니다. 여기 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) 
} 

은 내가 대신 ???의 놓아야 간단한 코드 예제입니다? ValueCell을 사용하지 않는 솔루션에 대해서도 열려 있습니다. 결국 WiringUI를 사용해야하므로 결국에는 일부 셀이 필요할 것입니다.

편집 : 내가 아이디어에 와서 좀 더 조사 후 :하십시오 case class 같은 SeqCell 만 구현하는 것이라고

편집lengthcontent 세포가 될 필요는 없지만 그들이 설정 가능해야 매개 변수의 셀 및 임의의 수의 셀에 대해 형식을 사용하지 않습니다. 가능한가?
여기 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() 
} 

편집 : 스칼라 Cell에서covariant하지, 그래서 내 여러 입력 세포 밖으로 SeqCell을 할 수 없습니다 것 같다. 셀의 임의의 수에 대한 글로벌 솔루션을 정말 고맙게 생각합니다.

답변

1

체크 아웃 FuncCell을 확인하십시오. 그것은 하나 이상의 다른 세포의 기능으로 그 가치를 결정할 또 다른 세포 일뿐입니다. 내가 제공 한 링크는 기존의 FuncCell1 .. FuncCell5 구현에 해당하는 1-5 셀에 대한 메소드를 적용한 동반자 객체입니다. 이러한 셀 중 하나가 값을 변경하면 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는 그 값이 CellreferenceList.filter를 호출 한 결과를 반영합니다 지금 SeqCell에 대한 귀하의 편집에 대응


, 나는 두 가지 솔루션을 생각할 수 있습니다 :

1) 기존 FuncCell 구현을 사용할 수 있도록 튜플에 중간 세포를 결합 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)의 형식 매개 변수로 Any를 사용합니다.

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

감사합니다. 그러나이 솔루션을 임의의 수의 셀로 사용할 수는 없지만 SeqCell (cells : Cell [T] *) 나는 그것을 사용하는 방법을 모른다. (실제로'*'가 무엇을 의미하는지 모르며, 검색 엔진에서 확인하기가 어렵다.) –

+1

'*'는 당신이 할 수 있다는 것을 의미한다. 'cells' 인수 대신 쉼표로 구분 된 임의의 수의 인수를 입력하십시오. "varArgs"를 사용하면 더 나은 검색 결과를 얻을 수 있다고 생각합니다. 'SeqCell'의 한계는 각 셀이 같은 타입 ('T')이어야한다는 것입니다. 조금 더러울 수도 있지만, 당신은 언제나 Tuples의 셀에 당신의 주장을 응축시킬 수 있습니다. 예 : 셀 A와 셀 B를 가지고 있다면, FuncCell (aCell, bCell) {(a, b) => a-> b}' – Dylan

+0

으로 결합 할 수 있습니다. 나는 내 문제를 해결할 수있다. 그러나 나는 "varArgs"가 무엇을 의미하는지, 어떻게 사용하는지 이해하지 못합니다. 예를 들어 줄 수 있습니까? –