繁体   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