如何通過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