2014-10-11 67 views
0

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

回答

3

如果我理解你是正确的,你会问为什么调试消息(例如@loader.debugdebug("debugFloorAreaDESELECT");)在每个站点负载上调用,而不仅仅是点击..?

这是因为Play模板在服务器端得到呈现,即一旦template.render()将在控制器中被调用。这会影响所有的模板Scala的部分(即开始@一切)

如果你想调试在客户端,你可以使用JavaScript的console.log()

+0

是的,这正是我想知道的(为什么不仅在点击?..)有没有办法来防止/解决方法,调用? – alpalp1977 2014-10-11 16:43:08

+0

顺便说一句。我得到了一个回复@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

+0

是的,如果您希望仅在用户实际点击时才计算结果,则需要将方法更改为Ajax样式。通常,您可以使用Play的标准异步操作并向客户端发送和接收JSON。我会建议阅读文档的相应部分,如果您在特定问题上遇到问题,请打开另一个问题;) – mdell 2014-10-12 10:31:37

1

虽然以前的答案所描述的那样,我会使用那句我重复了好几遍了:

播放模板服务器端技术,所以它的游戏通期间呈现(即,如果您的意见将被缓存1个月,你将有1月龄值查看),JavaScript is ClientSide。这意味着 - 你不能混这样。