在 ajax 中更新 twig for 循环

update twig for loop in ajax

我正在做聊天室项目,并尝试用 ajax 更新用户状态。

问题是一个用户可能有多个好友,所以首先我使用twig for循环显示所有好友,像这样,函数getLastActivity()是获取用户的最后在线时间,如果它大于当前时间, 然后显示用户在线。

{% for user in users%}
  {% if app.user.name != user.getName() %}
    <div id="status">
      {% if getLastActivity(user.getId()) > date("now + 8 hours - 10 seconds") %}
        <span class="online_icon"></span>
      {% else %}
        <span class="online_icon offline"></span>
      {% endif %}
    </div>
  {% endif %}
{% endfor %}

我不太擅长ajax,如果有什么奇怪的地方请告诉我。我的想法是每 3 秒更新一次状态字段。但它只能更新第一个朋友。

我的猜测是,因为在twig模板中我只写了一次,所以它没有更新其余的朋友。

$(document).ready(function () {
        setInterval(function(){
            update_status();
        }, 3000);

        function update_status()
        {
            $.ajax({
                success:function(){
                    $('#status').load(" #status");
                }
            })
        }
    })

我受到这篇文章的启发,,但不确定如何在我的问题中实现它。

我的问题是,是否可以使用ajax来更新所有好友状态,或者有更好的方法来实现这一点。

谢谢

您遇到的问题是您为每个用户创建了一个 ID 为 status 的元素。 ID 是 唯一标识符,但您对每个元素使用相同的标识符。

例如,您可以根据用户 obj 创建具有 id 的元素:

{% for user in users%}
  {% if app.user.name != user.getName() %}
    <div id="status-{{ user.id }}">
      {* ... *}
    </div>
  {% endif %}
{% endfor %}

我不知道您的 update_status() 函数到底是什么样子,但您需要以某种方式获取用户 ID。您可以 return 它作为 ajax,像这样:

$.ajax({
  success: function(userId){
    $('#status-' + userId).load(" #status");
  }
})

或者您遍历所有元素,您将使用 el.attr('id').

获得 id