0

php/mysql バックエンドとブートストラップ/jQ フロントエンドがあります。そして4時間の頭痛。

フォーム要素は次のようになります。

<input id="location_name" name="location_name" data-provide="typeahead"
    autocomplete="off" type="text" placeholder="Location name" 
    class="input-xlarge" required="yes" value="" />

jQuery は次のようになります。

$(document).ready(function(){
    $('#location_name').typeahead({

        'source': function (query,typeahead) {
            var id = $("#area_id option:selected").attr('value');
            return $.get(
                '/app/event/location_name_typehead.php', 
                { 'location_name': encodeURIComponent(query), 'area_id' : id }, 
                function (data) { return data; }
            );
        },
        'items': 4,
        'minLength': 2
    });
});

PHP は次のようになります。

<?php
header('Content-type: text/json');  
$location_name = $_REQUEST['location_name'];
$area_id     = $_REQUEST['area_id'];
//print_r($_REQUEST);

// ... PDO setup ...

$locations = $location_recs->fetchAll(PDO::FETCH_ASSOC);

if(count($locations) == 0) { 
    echo '[]'; 
} else {
    foreach ($locations as $location) {
        $names[] = $location['location_name'];
    }
    echo '[ "'.implode('", "', $names).'" ]';
};
?>

私は戻り値の型として「application/json」と「text/json」の両方を試しtypeahead.process(data)、データのjQuery jsonデコードのバリエーションを使用して、気の毒なことを機能させました。検索結果が返されています。つまり、フィールドに入力すると ajax 呼び出しがトリガーされ、返されたドキュメントは正しいように見えます。

[ "Administration Block", "Science Block" ]

それを止めている明らかに明白な(私が推測する)構文の問題を誰かが指摘できますか?

4

1 に答える 1

1

AJAX 呼び出しから何も返すことはできません。これらは非同期であるため、コールバックでデータに関連することを行う必要があります。

また、先行入力では、source関数が配列を返すか、2 番目のパラメーターとして渡された関数を呼び出す必要があります。あなたの場合、非同期であるため何も返すことができないため、2番目のパラメーターを使用する必要があります。

'source': function (query,typeahead) {
    var id = $("#area_id option:selected").attr('value');

    $.get('/app/event/location_name_typehead.php', {
        'location_name': encodeURIComponent(query),
        'area_id': id
    }, function(data){
        typeahead(data);
    });
},
于 2013-08-22T19:28:56.073 に答える