我的模板文件中有很多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");
});
}
我的问题是如何在每个页面加载时自动调用“on”点击处理程序?如何在页面加载期间阻止调用?
我用于在jsfiddle显示/隐藏功能示例:anotherjsfiddle但是我使用了多个点击处理程序(这里仅显示了info2元素)。我将jquery“live”事件方法更改为“on”,因为“live”已被弃用。
答案 0 :(得分:3)
如果我理解你的话,你会问为什么调试消息(例如@loader.debugdebug("debugFloorAreaDESELECT");
)会在每次网站加载时调用,而不仅仅是点击..?
这是因为Play模板在服务器端呈现,即只要在控制器中调用template.render()
。这会影响模板中的所有Scala部分(即以@
开头的所有内容)
如果您想在客户端进行调试,可以使用JavaScripts console.log()
答案 1 :(得分:1)
虽然之前的回答描述了它,但我会使用一个我已重复几次的短语:
播放模板是 ServerSide 技术,所以它在播放期间呈现(即如果您的观看次数将被缓存1个月,您将在视图中显示1个月的值), JavaScript 是 ClientSide 。这意味着 - 你 不能 这样混合它。