在Play中调用控制器方法!模板

时间:2011-11-18 11:03:05

标签: java playframework

如何在Play中调用控制器方法!模板?

我有一个默认控制器,Application和该控制器内的hasliked()方法。 该方法返回登录用户是否喜欢帖子ID。 如果用户喜欢帖子,则返回“none”,否则返回“block”(对于CSS)

我添加了以下路线: GET / hasliked / {id} Application.hasliked

我尝试了以下内容:

  

#{list items:postList, as:'post'}     %{        display = Application.hasliked(post.id);     %}

     

<div style="display: ${display}">...</div>   #{/list}

但是我收到了这个错误:

  

模板执行错误

     

模板/app/views/Application/dashboard.html中发生执行错误。 引发的异常是NullPointerException:无法在null对象上调用hasliked()方法。

4 个答案:

答案 0 :(得分:6)

尝试使用完全限定的名称,如:

controllers.Application.hasliked()

对评论进行编辑:

您的例外问题是您正在访问控制器以获取值。那是错的。

Play中的控制器用于导航。它们是静态的,它们返回“void”,并且它们调用另一个控制器方法或渲染方法。你试图做的可能会有意想不到的结果。

您要做的是获取控制器内的值并将其作为参数传递:

//On controller

public static void yourRequest() {
   //...
   Object display = getDisplay(); //get your value
   render(display);
}

//On template
<div style="display: ${display}">...</div>

这是推荐的方式。

您获得的异常(很可能)是因为您的Application.hasLiked()以重定向调用(render()或调用另一个控制器的方法)结束而且当您渲染与初始对应的页面时发生的异常呼叫。所以它打破了。

答案 1 :(得分:4)

这可能是一种更好的方法来填充项目列表中所需的信息,而不是回调控制器:

  • 您的模板无需了解您的控制器。它应该只是将数据转换为HTML而不是从其他地方获取数据。这是控制器的任务。
  • 在数据库访问方面,一次获取所有项目的状态而不是多次调用也会更有效。
  • 在进行重构时(例如,重命名控制器的方法等),如果从模板中调用控制器,IDE将无法帮助您(除非它知道Play!模板的工作方式)。

如果你真的必须这样做(并且你不应该这样做),你需要完全限定控制器的名称:

controllers.Application.hasLiked() 

就像Pere Villega指出的那样。

答案 2 :(得分:1)

替代方法可能是发出一个AJAX调用来设置样式,而不是使用控制器。

设置你喜欢&#34;的风格。默认情况下,元素到display: none,当您的视图已呈现时,向ID {1}}发出GET请求,并将ID作为参数并相应地更新CSS样式:当用户尚未喜欢此项时,输出/hasliked/(或任何你想要的),以便您可以使用JavaScript重新定义样式。

最简单的方法是在加载视图时使用jQuery向控制器发出请求。看一下the Play! documentation on AJAX的灵感。请注意,您根本不必使用false - 我个人觉得自己定义jQuery调用更容易。

答案 3 :(得分:-1)

尝试以下方法:

<script type="text/javascript" language="javascript">
    var url = "@{Application.hasliked}" + "/" + yourId;
    window.location.replace(url);
</script>