2013-05-14 69 views
2

如何通过id选择NodeSeq通过它的id选择NodeSeq(IdSelector?)

在电梯中,有“CssSelectors”,允许您执行类似"#myId" #> function的操作,而function只接收所需的NodeSeq作为输入。

但是,如何使用这个好的“css选择器”来选择节点,而不是直接在后面应用一个函数?

我知道它可以通过搜索NodeSeq中的所有"id"属性来完成,但是它不是比Lift的版本更耗CPU吗?任何想法或建议?

回答

1

使用^^选择器(它忽略#右侧>):

scala> import net.liftweb.util.Helpers._ 
import net.liftweb.util.Helpers._ 

scala> "#id ^^" #> "" apply <test><el id="id"/></test> 
res0: scala.xml.NodeSeq = NodeSeq(<el id="id"/>) 

至于性能方面,显然升力必须要遍历ID属性本身。

+0

谢谢!这正是我所期待的! 关于表现 - 我仍然会质疑。例如,在大多数情况下,Lift使用的模板和选择器数量有限且少量。模板(NodeSeq)和选择器都是不可变的。 为什么不提升高速缓存不仅是NodeSeq,而是应用选择器? 例如,如果Lift的缓存模板(.html)并在此模板上看到选择器,他可能会记忆一些结果。 – VasyaNovikov 2013-05-17 15:34:53

+0

我的意思是,AFAIK电梯不这样做,但他可以。也许会在未来。 – VasyaNovikov 2013-05-17 15:44:13

1

有几种方法可以遍历NodeSeq

val myNodeSeq = 
    <div> 
    <ul> 
     <li id="findme"></li> 
     <li></li> 
    </ul> 
    </div> 

我们可以使用Scala的XML解析器做这样的事情:

myNodeSeq \\ "li" filter(_ \ "@id" contains scala.xml.Text("findme")) 

这将返回:NodeSeq(<li id="findme"></li>)

我不认为上述任何更多的CPU比Lift的版本密集,但是没有理由不能使用lift的CssSelector--它已经被打破了,所以甚至不需要其他的升降框架。所以,像这样:

("#findme" #> { ns => 
    //do something with ns - which is the NodeSeq that matches 
}).apply(myNodeSeq) 

你也可以使用递归和模式匹配工作。

如果您对Lift实际上是如何匹配的感兴趣,可以查看CSS选择器的东西here

+0

感谢您的回答! 关于第一种方法和第二种方法 - 我已经在提问中提到了它们。你真的可以迭代NodeSeq并尝试从内部捕获模板。目标是将NodeSeq作为一个变量来捕获,以便以后使用它。 无论如何,链接到电梯的BindHelpers是有用的,谢谢。) – VasyaNovikov 2013-05-17 15:41:35