Ajax调用没有返回响应,只需重新加载页面

时间:2017-08-29 15:27:35

标签: ajax symfony

我有一个Symfony 3 CRM,我使用ajax调用来删除整个系统中的项目。它使用单个调用,然后使用switch语句来确定用户尝试删除的内容并相应地处理它。

但是,由于某些特殊类型的项目似乎不起作用,它只是重新加载页面。

这是触发按钮(我正在实施bootstrap确认):

<a href="" data-type="unit" id="{{ unit.id }}"
 data-toggle="confirmation-singleton"
 data-btn-ok-class="btn btn-xs btn-success"
 data-btn-cancel-class="btn btn-xs btn-danger"
 class="btn btn-xs btn-danger remove-item">
  <i class="fa fa-remove no-override"> </i>
</a>

我的ajax要求删除项目:

$('.remove-item').confirmation({
    rootSelector: '[data-toggle=confirmation-singleton]',
    container: 'body',
    onConfirm: function() {
        var type = $(this).attr('data-type');
        var id = $(this).attr('id');
        var data = type + '|' + id;
        $.ajax( '/app_dev.php/ajax-call/remove-item/' + data )
            .done( function(response) {
                if(response != 'success') {
                    if(response == 'units_exist') {
                        alert("You cannot delete this item as there are units already linked to it.");
                    } else if(response == 'no_property') {
                        alert("Sorry! Property could not be found.");
                    } else if(response == 'bookings_exist') {
                        alert("Sorry! This unit has bookings. Please delete the bookings first.");
                    }
                }
            });
        return false;
    },
    onCancel: function() {
        return false;
    }
});

在PHP方面,对于这个特定的例子:

$data = $request->get('data');

$parts = explode("|",$data);
$type = $parts[0];
$id = $parts[1];

// using switch on $type
case 'unit':
  $em = $this->getDoctrine()->getManager();
  $repo = $em->getRepository('AppBundle:Unit');
  $booking_repo = $em->getRepository('AppBundle:Booking');
  $bookings = $booking_repo->findBy(array('unitId' => $id)); // check to see if any bookings exist
  if(!empty($bookings)) {
      return new Response('bookings_exist');
  } else {
      $item = $repo->findOneBy(array('id' => $id));
      if(!empty($item)) {
          $em->remove($item);
          $em->flush();
      }
  }

  break;

在这个例子中,它应该返回'bookings_exist',如果我直接转到浏览器中的URL,它会显示此消息 - 但是,它只是重新加载页面而不是按照ajax中的规定抛出警报呼叫。我知道这个调用有效,因为它成功删除了CRM中的其他项目,它似乎就是因为这样的条件而无法删除它。

我可能会遗漏一些非常明显的东西,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

对于jQuery Ajax,请使用successerror处理程序

jQuery的Ajax对象中的其他处理程序充其量不可靠,并且在版本和浏览器之间的行为和支持各不相同。

使用ajax处理事件

防止默认通常是一个好主意

如果jQuery失败,并且不返回false,该元素将执行它的默认行为,在您的情况下,<a href=""></a>会重新加载页面。

onConfirm: function(e) {
    e.preventDefault();
    var type = $(this).attr('data-type');
    var id = $(this).attr('id');
    var data = type + '|' + id;
    $.ajax( '/app_dev.php/ajax-call/remove-item/' + data )
        .success( function(response) {
            if (response.errorMessage) {
                alert(response.errorMessage);
            }
        })
        .error( function(xhr, status, error) {
            console.log(status + '\n' + error);
        })
    ;
    return false;
}

PHP Side,构建一个JSONResponse

if(!empty($bookings)) {
     return new JsonResponse([
        'errorMessage' => 'Sorry! Property could not be found.'
     );
}

答案 1 :(得分:0)

而不是仅添加.done(),您还应该使用

 .fail(function( jqXHR, textStatus, errorThrown ) {});

捕捉任何错误。

答案 2 :(得分:0)

如果预订不为空,则该功能将返回新的回复&#39; booking_exist&#39;并停止......它不会进入下一个陈述。

因此,如果您需要删除该项目,请改用此代码:

if(empty($bookings)) {
      return new Response('bookings_not_exist');
  } else {
      $item = $repo->findOneBy(array('id' => $id));
      if(!empty($item)) {
          $em->remove($item);
          $em->flush();
      }