簡體   English   中英

Play Framework 2.1中視圖的相對時間

[英]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時間將在客戶端更新時仍然正確顯示。
  • 即使沒有頁面刷新它也會自動更新(就像這里,在Stack Overflow上)

據我所知,這是不可能再做的(默認情況下在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM