如何通过id选择NodeSeq
?通过它的id选择NodeSeq(IdSelector?)
在电梯中,有“CssSelectors
”,允许您执行类似"#myId" #> function
的操作,而function
只接收所需的NodeSeq作为输入。
但是,如何使用这个好的“css选择器”来选择节点,而不是直接在后面应用一个函数?
我知道它可以通过搜索NodeSeq中的所有"id"
属性来完成,但是它不是比Lift的版本更耗CPU吗?任何想法或建议?
如何通过id选择NodeSeq
?通过它的id选择NodeSeq(IdSelector?)
在电梯中,有“CssSelectors
”,允许您执行类似"#myId" #> function
的操作,而function
只接收所需的NodeSeq作为输入。
但是,如何使用这个好的“css选择器”来选择节点,而不是直接在后面应用一个函数?
我知道它可以通过搜索NodeSeq中的所有"id"
属性来完成,但是它不是比Lift的版本更耗CPU吗?任何想法或建议?
使用^^选择器(它忽略#右侧>):
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属性本身。
有几种方法可以遍历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。
感谢您的回答! 关于第一种方法和第二种方法 - 我已经在提问中提到了它们。你真的可以迭代NodeSeq并尝试从内部捕获模板。目标是将NodeSeq作为一个变量来捕获,以便以后使用它。 无论如何,链接到电梯的BindHelpers是有用的,谢谢。) – VasyaNovikov 2013-05-17 15:41:35
谢谢!这正是我所期待的! 关于表现 - 我仍然会质疑。例如,在大多数情况下,Lift使用的模板和选择器数量有限且少量。模板(NodeSeq)和选择器都是不可变的。 为什么不提升高速缓存不仅是NodeSeq,而是应用选择器? 例如,如果Lift的缓存模板(.html)并在此模板上看到选择器,他可能会记忆一些结果。 – VasyaNovikov 2013-05-17 15:34:53
我的意思是,AFAIK电梯不这样做,但他可以。也许会在未来。 – VasyaNovikov 2013-05-17 15:44:13