Tapestry 5.4不止一次调用jquery

时间:2013-09-13 22:49:03

标签: javascript jquery twitter-bootstrap tapestry

我正在尝试将Bootstrap popover集成到我的Tapestry 5.4-alpha-14应用程序中。我是Tapestry的新手,我不知道如何在那里使用javascript。

我的问题是,我想在刷新区域时在区域循环中的每个元素上显示Bootstrap popover。首先,我在区域中没有元素,然后用户提交一个表单并加载一个元素,然后进行一些更多的用户交互,另一个元素被加载,依此类推......我想在每个加载的元素上显示popover在循环。使用下面的代码我只能在加载第一个元素时显示弹出窗口,但是当加载第二个元素时,弹出窗口就丢失了。我还注意到第二次加载时没有调用.js代码。

.tml代码的一部分:

<t:zone t:id="selectedPagesZone" id="selectedPagesZone">
 <div class="well" t:type="Loop" t:id="selectedLoop" t:source="selectedPages" t:value="item">
    <div class="pop" data-toggle="popover" rel="popover" data-placement="top"  data-container="body" data-content="Content" title="Title">
        ...
     </div>
   </div>
</t:zone>

.java代码的一部分:

void onSuccess() {
...
ajaxResponseRenderer.addRender(selectedPagesZone).ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
   public void run(JavaScriptSupport javaScriptSupport) {
      javaScriptSupport.require("popover");
    }
});

popover.js代码:

(function ($) {
options = {
    placement:'right',
    trigger: 'hover',
    container: 'body',
    html: true
  }
$('.pop').popover(options);
$('.pop').popover('show');
})(window.jQuery);

我很感激你能给我的任何帮助。

1 个答案:

答案 0 :(得分:1)

require.js只会执行一次js的主体。您应该定义一个配置一次但多次执行的函数。

popover.js

define(["jquery"], function($) {
    var privateFunc = function(args) {
        options = {
            placement:'right',
            trigger: 'hover',
            container: 'body',
            html: true
        };
        $('.pop').popover(options);
        $('.pop').popover('show');
    };
    return { publicFunc: privateFunc};
});

java代码

ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
    public void run(JavaScriptSupport javaScriptSupport) {
        JSONObject args = new JSONObject("foo", "bar");
        javaScriptSupport.require("popover").invoke("publicFunc").with(args);
    }
});

有关详细信息,请参阅here