Playframework 2.1.2如何防止scala函数调用模板加载?

时间:2014-10-11 14:49:13

标签: javascript jquery scala playframework onclick

我的模板文件中有很多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”已被弃用。

2 个答案:

答案 0 :(得分:3)

如果我理解你的话,你会问为什么调试消息(例如@loader.debugdebug("debugFloorAreaDESELECT");)会在每次网站加载时调用,而不仅仅是点击..?

这是因为Play模板在服务器端呈现,即只要在控制器中调用template.render()。这会影响模板中的所有Scala部分(即以@开头的所有内容)

如果您想在客户端进行调试,可以使用JavaScripts console.log()

答案 1 :(得分:1)

虽然之前的回答描述了它,但我会使用一个我已重复几次的短语:

  

播放模板是 ServerSide 技术,所以它在播放期间呈现(即如果您的观看次数将被缓存1个月,您将在视图中显示1个月的值), JavaScript ClientSide 。这意味着 - 你 不能 这样混合它。