JQuery JSON Ajax Callback не работает - Cakephp - PullRequest
0 голосов
/ 24 октября 2009

Я пытаюсь написать простую запись в формате JSON, и предупреждение об обратном вызове не отображается независимо от того, что я делаю. Я использовал firebugs, чтобы увидеть, получал ли пост какой-либо ответ, и "ОБУВЬ" возвращается. Так почему предупреждение не работает в обратном вызове?

смотреть код:

$('#GaragePartAddfrompartlistForm').click(function() { 
      var item = "CHEESE"; 
  $.post("garage_parts/getlastid", { 'item' : item }, 
   function(data){ 
     alert(data.result); 
   }, "json"); 
    }); 

код контроллера:

function getlastid() { 
    $newid = "SHOE"; 
        $array = array('result' => $newid); 
        echo json_encode($array); 
    } 

Ответы [ 5 ]

3 голосов
/ 24 октября 2009

Убедитесь, что вы устанавливаете для debug значение 0 в beforeFilter, используйте компонент RequestHandler, чтобы проверить, является ли это запросом ajax.

Использовать RequestHandler

var $components = array(..., 'RequestHandler', ...);

установить отладку на 0, если это ajax-запрос

function beforeFilter()
{
    if ($this->RequestHandler->isAjax()) {
        Configure::write('debug', 0);
    }
}

и в твоей функции

function getlastid() 
{
    $this->autoRender = false;
    $this->autoLayout = false;

    $newid = "SHOE";
    $response = array('result' => $newid); 

    $this->header('Content-Type: application/json');
    echo json_encode($response);
    return;
}

Если вы выводите json и не устанавливаете debug в 0, то к концу торт добавит время выполнения, и он не будет действительным ответом json, мешая jQuery правильно его прочитать.

В качестве дополнения, обычно я устанавливаю еще кое-что в $ response, чтобы я мог лучше с этим справиться.

function getLastId()
{
    ...
    $response = array('success' => false);

    ... code ...
    if ($my_code_is_good) {
        $response['success'] = true;
        $response['data'] = $my_code_result;
    }

    ...
}

Надеюсь, это поможет

1 голос
/ 24 октября 2009

Вы должны попытаться установить заголовок HTTP в ответе:

header("Content-type: application/json")

или

header("Content-type: text/plain")

jQuery может не обрабатывать ваш ответ, поскольку он не возвращает ожидаемый тип.

Ваш код ответа будет:

function getlastid() { 
    header("Content-type: text/plain");
    $newid = "SHOE"; 
    $array = array('result' => $newid); 
    echo json_encode($array); 
}

Надеюсь, это поможет!

0 голосов
/ 31 декабря 2009

Я обнаружил, что в моем приложении symfony / PHP обычные текстовые ответы без HTML-символов (с использованием нулевого или json-типа dataType) будут вызывать успешный обратный вызов. Однако если сервер не выводит ничего, кроме заголовков, обратный вызов успеха не вызывается (что я считаю ошибкой).

Кроме того, если ответ сервера содержит символы HTML (<> и т. Д.), Обратный вызов снова не будет вызван, если для типа контекста явно не задано значение text / html. Это также позволило удалить раздражающие теги

, добавленные неправильно jQuery, а также помешало jQuery преобразовать ответ в объекты HTML (& lt; & gt; и т. Д.). 
0 голосов
/ 24 октября 2009

Я не слишком знаком с тортом, но я использую codeigniter (который похож) ...

Одна вещь, которую я заметил с такими фреймворками, это то, что когда вы отправляете ответ json, используя echo json_encode($array), вы должны сразу ввести exit(); на следующей строке. С другой стороны, фреймворк отправляет заголовки, указывающие на HTML-тип mime.

Может быть, так и с тортом, в любом случае стоит попробовать ...

0 голосов
/ 24 октября 2009

Не забудьте установить пустой макет для ответов Ajax:

function getlastid() { 
    $this->layout = 'ajax';
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...