[英]Relative time for views in Play Framework 2.1
似乎Play框架使用(?)有一個since()
函數來獲取Play 1.x視圖中的相對時間(如“4分鍾前”)。 這在這里被稱為日期擴展
但是在Play 2.1中,這似乎不再起作用了。 我得到的value since is not a member of java.util.Date
...另外我找不到任何其他對於since()
(在Play 2.1的上下文中)的在線引用。
是否有正確/默認的方式來處理這種常見情況? 我覺得我必須遺漏一些重要的東西,因為這似乎不再受到支持了?
謝謝!
since()
2.0分支開始since()
方法不可用。
不是直接的答案,但如果有可能我建議使用JavaScript插件來完成此任務的一個例子: timeago jQuery插件原因:
since
時間將在客戶端更新時仍然正確顯示。 據我所知,這是不可能再做的(默認情況下在Play2.1中)。 如果我錯了,請糾正我。 這是我重新創建它的方式。 如上所述,我“拉皮條”了“日期”類:
//文件app / views / pimps.scala
package views
package object pimps {
import java.util.Date
import org.joda.time.DateTime;
import org.joda.time.Period;
class PimpedDate(col: Date) {
def since() = {
def addS(b: Int) = if (b == 1) "" else "s"
val now: DateTime = new DateTime();
val period: Period = new Period(new DateTime(col), now);
var r: String = "";
if (period.getYears() > 0) {
r = period.getYears() + " year" + addS(period.getYears()) + " ago";
} else if (period.getWeeks() > 0) {
r = period.getWeeks() + " week" + addS(period.getWeeks()) + " ago";
} else if (period.getMonths() > 0) {
r = period.getMonths() + " month" + addS(period.getMonths()) + " ago";
} else if (period.getDays() > 0) {
r = period.getDays() + " day" + addS(period.getDays()) + " ago";
} else if (period.getHours() > 0) {
r = period.getHours() + " hour" + addS(period.getHours()) + " ago";
} else if (period.getMinutes() > 0) {
r = period.getMinutes() + " minute" + addS(period.getMinutes()) + " ago";
} else {
r = period.getSeconds() + " second" + addS(period.getSeconds()) + " ago";
}
r
}
}
implicit def pimpDate(col: Date) = new PimpedDate(col)
}
然后在我看來我可以導入上面的內容:
@import views.pimps._
然后像在Play1中一樣使用from since()
<td>@record.created_on.since()</td>
請評論/回答是否有更好的方法來執行此操作或編寫scala代碼...
@Jack提出了一個很好的答案。
這是他的代碼的一個版本可能很有用,因為它會在需要時啟用一些組合( check
功能不是組合,但可以很容易地改變組成並顯示更詳細的值)
package object pimps {
import java.util.Date
import org.joda.time.DateTime;
import org.joda.time.Period;
def step(f:Period => Int)(fi:String):Period => Option[String] = {
def g(i:Int = 1) = i + " " + fi + (if (i==1) "" else "s") + " ago"
(p:Period) => {
f(p) match {
case 0 => None
case 1 => Some(g())
case x => Some(g(x))
}
}
}
val yearsStep = step(_.getYears)("year")
val monthsStep = step(_.getMonths)("month")
val daysStep = step(_.getDays)("day")
val hoursStep = step(_.getHours)("hour")
val minutesStep = step(_.getMinutes)("minute")
val secondsStep = step(_.getSeconds)("second")
val steps = Seq(yearsStep, monthsStep, daysStep, hoursStep, minutesStep, secondsStep)
val check =
(p:Period) =>
steps.collectFirst {
case f if f(p).isDefined => f(p).get
}
implicit class PimpedDate(col: Date) {
def since() = {
val period: Period = new Period(new DateTime(col), DateTime.now);
check(period)
}
}
}
正如您所看到的,現在我們停在第一個匹配級別,並且我們也重復getter(getYears如果匹配將被調用兩次)。
然而,需要注意的另一件事是使用Scala 2.10中引入的implicit class
來緩解拉皮條
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.