JQuery AJAX вызов, как справиться - PullRequest
2 голосов
/ 01 августа 2010

Мне интересно, как лучше всего обрабатывать вызовы AJAX с помощью jQuery? Сейчас я делаю что-то вроде следующего:

$("#test").live('click', function(){
    // Process form
    $.ajax({
        type: "post",
        url: "test.php",
        success: function(html){
            if(html.success == 0) {
                alert('Error');
            } else {
                var obj = $.parseJSON(html.rows);
                $("#success").html(obj[0].name);
            }
        },
        dataType:'json'
    }); 
    return false;
});

В файле test.php я проверяю, является ли запрос запросом AJAX. Если это AJAX-запрос, я выполняю запрос к базе данных, чтобы получить некоторые данные (я думаю, эта часть не важна в этом вопросе):

// query goes here
if(mysql_num_rows($query) > 0 ) {
    $result['success'] = 1;
    $result['data'] = json_encode($data);
} else {
    $result['success'] = 0;
}

Теперь мне интересно, является ли мой метод наилучшим из возможных? К вашему сведению, в настоящее время я использую фреймворк KohanaPHP, поэтому я не хочу нарушать «правила» MVC. Если я делаю это неправильно, есть ли у вас какие-либо советы и предложения, как обрабатывать вызовы AJAX в контроллерах?

С уважением, Том

Ответы [ 2 ]

1 голос
/ 01 августа 2010

То, что у вас хорошо выглядит здесь, хотя я не думаю, что вам нужно $.parseJSON() там, это уже должен быть объект в этой точке, это должно работать:

$("#success").html(html.rows[0].name);

Как сторонаобратите внимание, что с точки зрения читабельности / удобства обслуживания я бы переименовал ваш аргумент html в data, например:

success: function(data) {

Это чисто предпочтение, но с использованием html, когда это HTMLвведите response и data или что-то еще, когда это JSON / уже ожидаемый объект, что немного упрощает чтение для посторонних.

0 голосов
/ 07 августа 2010

@ tom - вам нужно закодировать массив PHP следующим образом:

$data = array(
    'status' => 'success'
);

echo json_encode($data);

Но вы можете немного изменить структуру массива.Поскольку объект xhr имеет текстовый статус, я обычно кодирую массив JSON следующим образом:

$response = array(
    'status' => 'success' // or flash or error
    ,'flash' => array(
                   'header' => 'whatever is wrong with submission of data html list format'
                   'fields' => array('field names to be highlighted')
                   )

    ,'html'  => 'html presentation'
    ,'data   => array('json data')
);

echo json_encode($response);

Теперь вы можете сделать несколько полезных вещей, таких как:

           ,success:    function(response) {
                if (response.status === 'success') {
                    $('.basic_container').hide();
                    that.removeDataTable();
                    that.getContent(contentUrl);
                    $('.basic_container').show();
                }
                if (response.status === 'flash') {
                    $('#flash').html(response.flash.header);
                    $('#flash').show();
                    that.highlightWithFlash(response.flash.fields);
                }
            }
...