我的模板文件中有很多Scala函数调用,不幸的是,他们在模板加载期间因某种原因而自动调用。我怎样才能防止这些被叫?Playframework 2.1.2如何防止模板加载的scala函数调用?
我的意图是他们只有在某些点击事件后才被调用。在模板加载时(26s vs 3s),我会获得巨大的性能提升。
我有一个DataLoader Java对象,它正在从模板中调用,并从数据库读取值。 DataLoader的相关部分:
public void SetAllowLoading() {
System.out.println("DataLoader SetAllowLoading > ");
allowLoading = 1;
}
public void SetDisAllowLoading() {
allowLoading = 0;
}
public void debugdebug(String text) {
System.out.println(text);
}
public List<Double> loadAreaLengthData() {
List<Double> areaLengthArray = new ArrayList<Double>();
System.out.println("DataLoader OUT loadAreaLengthData > ");
if (allowLoading > 0) {
System.out.println("DataLoader IN loadAreaLengthData > ");
areaLengthArray.add(Component.getPipeLenghtsAccordingToRelativeFloorAreaMeters(0, 11));
areaLengthArray.add(Component.getPipeLenghtsAccordingToRelativeFloorAreaMeters(11, 21));
areaLengthArray.add(Component.getPipeLenghtsAccordingToRelativeFloorAreaMeters(21, 31));
areaLengthArray.add(Component.getPipeLenghtsAccordingToRelativeFloorAreaMeters(31, 41));
areaLengthArray.add(Component.getPipeLenghtsAccordingToRelativeFloorAreaMeters(41, 51));
}
return areaLengthArray;
}
如果不允许加载,加载方法不会从数据库中读取。
然后把必要的部分从模板(pipeIndex.scala.html)
$("#info2").on("click", function() {
if($(this).hasClass("selected")) {
$("#info2").html('@Messages("consequence.floor") (m<sup>2</sup>/m)');
@loader.debugdebug("debugFloorAreaDESELECT");
deselectArea();
} else {
$(this).addClass("selected");
$(".chartsarea").slideFadeToggle(function() {
@loader.debugdebug("drawFloorAreaChart()");
var sarea = new Array();
var i = 0;
var number = 0;
@for(s <- loader.loadAreaLengthData) {
number = Math.round(@s);
if (!isNaN(number))
sarea[i] = Math.round(number/1000);
else
sarea[i] = 0;
i++;
}
var ticksArea = ["0-10", "10-20", "20-30", "30-40", "40-50"];
areaObj = {
// Only animate if we're not using excanvas (not in IE 7 or IE 8)..
animate: !$.jqplot.use_excanvas,
seriesDefaults:{
renderer:$.jqplot.BarRenderer,
pointLabels: { show: true }
},
axes: {
xaxis: {
renderer: $.jqplot.CategoryAxisRenderer,
ticks: ticksArea
}
},
highlighter: { show: false }
}
plot3 = $.jqplot('chartarea', [sarea], areaObj);
$("#info2").focus();
$("#info2").html('@Messages("consequence.hide.floor")');
});
}
return false;
});
function deselectArea() {
$(".chartsarea").slideFadeToggle(function() {
$("#info2").removeClass("selected");
});
}
我的问题是如何,“对”,单击处理器在每个页面加载自动调用?如何防止页面加载期间的调用?
我用于显示/隐藏功能的例子在jsfiddle:anotherjsfiddle但我使用了多个点击处理程序(这里只显示info2元素)。我将jquery“live”事件方法更改为“on”,因为“live”已被弃用。
是的,这正是我想知道的(为什么不仅在点击?..)有没有办法来防止/解决方法,调用? – alpalp1977 2014-10-11 16:43:08
顺便说一句。我得到了一个回复@playframework论坛: 您需要使用AJAX来稍后计算这些结果。 我的回答:我会看看AJAX。顺便说一句。 Playframework的异步结果和Websockets在这种情况下可用吗? https://www.playframework.com/documentation/2.0/JavaAsync https://www.playframework.com/documentation/2.0/JavaWebSockets 如果是,哪种方式(AJAX/async/webS)会更容易实现? – alpalp1977 2014-10-11 16:53:49
是的,如果您希望仅在用户实际点击时才计算结果,则需要将方法更改为Ajax样式。通常,您可以使用Play的标准异步操作并向客户端发送和接收JSON。我会建议阅读文档的相应部分,如果您在特定问题上遇到问题,请打开另一个问题;) – mdell 2014-10-12 10:31:37