4

我在一个页面中有一组会话,我想使用 AJAX 将其删除。即单击一个链接,无需导航到新页面,只需删除会话,并显示成功消息。

现在,根据给定的答案(仍然对我不起作用),我有以下内容:

控制器

use Symfony\Component\HttpFoundation\JsonResponse;
//..

public function ajaxRemoveSessionAction()
{
    $session = $this->getRequest()->getSession();
    $session->remove('name');

    return new JsonResponse(array('success' => true));
}

路由:

ajax_remove_session:
    pattern:  /remove-session
    defaults: { _controller: FooTestBundle:Page:ajaxRemoveSession }

枝条:

<a href="#" id="remove_session">Remove session</a>

<script type="text/javascript">
$(document).ready(function() {
    $('#remove_session').click(function(){
        event.preventDefault();

        $.ajax({
          url: {{ url('ajax_remove_session') }},
          cache: false,
          success: function(result){
             $(".success").append(result);
          }
        });
    });
});
</script>

更新问题:

使用路由、控制器和模板中的所有代码


控制器:PageController.php

/src/Simon/TestBundle/Controller/PageController.php

<?php

namespace Simon\TestBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\JsonResponse;


class PageController extends Controller
{
    public function helloAction($name)
    {


        $session = new Session();
        $session->start();

        $session->get('name', 'Drak');
        $session->get('name');

        $session->getFlashBag()->add('notice', 'Profile Updated');

        $messages = null;

        foreach($session->getFlashBag()->get('notice', array()) as $message){
            $messages = $message;
        }


        return $this->render('SimonTestBundle:Page:index.html.twig', array('name' => $name.' '.$messages));
    }


    public function ajaxRemoveSessionAction()
    {
        // Destroy the desired session
        $session = $this->getRequest()->getSession();
        $session->remove('name');

        return new JsonResponse(array('success' => true));
    }
}

模板:树枝模板

/src/Simon/TestBundle/Resources/views/Page/index.html.twig

{% extends 'SimonTestBundle::layout.html.twig' %}

{% block body %}
    <a href="#" id="remove_session">Remove session</a>



    <script type="text/javascript">
        $('#remove_session').click(function(e){
            e.preventDefault();

                $.ajax({
                    url: {{ url('ajax_remove_session') }},
                    cache: false,
                    success: function(html){
                        // do something on success
                    }
                }).fail(function(event){
                            console.log(event);
                        });
            });
        });
    </script>



{% endblock %}

路由:

/src/Simon/TestBundle/Resources/config/routing.yml

simon_test_homepage:
    pattern:  /hello/{name}
    defaults: { _controller: SimonTestBundle:Page:hello }

ajax_remove_session:
    pattern:  /remove-session
    defaults: { _controller: SimonTestBundle:Page:ajaxRemoveSession }
4

4 回答 4

4

示例控制器:

use Symfony\Component\HttpFoundation\JsonResponse;


public function ajaxRemoveSessionAction()
{
    // Destroy the desired session
    $session = $this->getRequest()->getSession();
    $session->remove('name');

    return new JsonResponse(array('success' => true));
}

路由示例:

ajax_remove_session:
    pattern:  /remove-session
    defaults: { _controller: FooTestBundle:Page:ajaxRemoveSession }

树枝示例:

<a href="#" id="remove_session">Remove session</a>

<script type="text/javascript">
$(document).ready(function() {
    $('#remove_session').click(function(){
        event.preventDefault();

        $.ajax({
          url: {{ url('ajax_remove_session') }},
          cache: false,
          success: function(html){
            // do something on success
          }
        });
    });
});
</script>

这些只是需要测试的示例。

于 2013-10-14T08:04:57.703 回答
1

尝试将 URL 选项的值放在引号之间:

url: '{{ url('ajax_remove_session') }}',
于 2013-10-16T11:56:49.440 回答
1

在您的 AJAX 调用中,您使用全局event对象,它不是跨浏览器且不应使用(例如 Firefox 没有它)。

在函数调用中传递事件:

$('#remove_session').click(function(e){
    e.preventDefault();

    // rest of your code
});

如果你这样做,jQuery 会关心跨浏览器的规范化和正确的行为。

另请参阅此问题以了解有关全局event对象和传递给函数的事件之间的区别的更多信息。


如果还是不行

  • 在 Chrome 中打开开发者工具 (F12)
  • 如果单击按钮后有任何错误报告,请检查您的控制台(控制台选项卡)
  • 另外,打开网络选项卡,查看单击按钮后是否发出任何请求;什么是响应状态?
  • 确保您的控制器适用于 GET 请求(因为您没有指定请求类型,并且GET是默认设置)
  • 您也可以尝试添加dataType: "json"到您的 AJAX 请求中,但这应该不是问题,因为 SymfonyJsonResponse应该已经提供了必要的响应标头

检查其他地方

  • 您发布的错误说明了意外在哪里:;调查那条线;您在此处发布的代码是whole您页面上的 javascript 吗?
于 2013-10-16T09:27:45.410 回答
1

在您对@Laurent Wartel 的回答发表评论后,我假设您现在得到了Uncaught SyntaxError: Unexpected token }. 现在很清楚,您的click()函数末尾有额外的括号。

此外,在绑定click()事件之前,您无需等待文档加载。因此,jQuery 尝试将事件绑定到尚未呈现的元素。这是一个常见的陷阱。

要在页面加载后运行代码,您必须将其包装 info $(function() { ... }。请在这里阅读完整的解释,因为这是基本的,但非常重要。

总结一下,正确的代码如下:

<script type="text/javascript">
    $(function() {
        $('#remove_session').click(function(e){
            e.preventDefault();

            $.ajax({
                url: '{{ url('ajax_remove_session') }}',
                cache: false,
                success: function(html){
                    // do something on success
                }
            }).fail(function(event){
                        console.log(event);
                    });
        });
    });
</script>

似乎您在调试期间以某种方式删除了该行,因为它存在于您的原始问题中,但不存在于您稍后发送的源代码中。

于 2013-10-16T12:20:53.807 回答