如何在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()方法。
答案 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)
这可能是一种更好的方法来填充项目列表中所需的信息,而不是回调控制器:
如果你真的必须这样做(并且你不应该这样做),你需要完全限定控制器的名称:
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>