4

我正在使用 Masonry 和 Rails 应用程序来渲染一个充满图像的屏幕。我的问题是在某些时候我使用远程 AJAX 表单进行调用,该表单稍后会刷新 div。在那之后,调用 Masonry 只是停止工作,调用它就像没有定义 Masonry 一样。

渲染代码相当简单,div Masonry 应该可以工作:

<div id="pins">
  <%= render @pins %>
</div>

我正在渲染的部分只是显示 Rails 模型,它看起来像:

<div id="pin-<%= pin.id %>" class="box">...</div>

在第一页加载 Masonry 的代码:

jQuery ->
    $('#pins').imagesLoaded ->
        $('#pins').masonry itemSelector: ".box", isAnimated: true

然后,在视图 Javascript 中,我重新渲染 div,如下所示:

$("#pins").html("<%= escape_javascript render @pins %>");

$('#pins').imagesLoaded(function() {
    alert("Hey");
    return $('#pins').masonry({
          itemSelector: ".box",
          isAnimated: true
    });
});

刷新后,会显示警报“嘿”,这意味着事件被触发并被很好地捕获。但是,调用了 Masonry 并且似乎正在重新附加内容但没有对其进行排序。为了测试这一点,我还尝试使用链接手动触发 Masonry,并且在调用 escape_javascript 后它也停止工作。当然,如果我尝试在没有 escape_javascript 的情况下渲染部分内容,则不会刷新任何内容。

我需要一些方法来渲染部分而不转义 javascript 或关于如何在 javascript 被转义后使 Masonry 可操作的说明。请注意,与上述重新声明时,其他 JQuery 组件工作正常的环境相同。

提前致谢。

4

2 回答 2

0

添加元素后尝试使用“附加”方法

http://masonry.desandro.com/methods.html#appended

于 2015-09-25T16:29:54.027 回答
0

只需触发重新加载元素,例如:

$(document).ajaxComplete -> $(element).masonry()

如果尝试在 $(element) 上捕获 ajaxComplete 将不起作用

于 2016-01-11T10:44:32.733 回答