JSON возвращается как отдельная строка, а не объекты - PullRequest
0 голосов
/ 21 августа 2011

Я использую Codeigniter и пытаюсь использовать автозаполнение jQuery с ним.Я также использую библиотеку отдыха клиента @Phil Sturgeon для Codeigniter, потому что я получаю данные автозаполнения от netflix.Я возвращаю правильный JSON и могу получить доступ к первому элементу с помощью

response(data.autocomplete.autocomplete_item[0].title.short);

, но когда я перебираю результаты

for (var i in data.autocomplete.autocomplete_item) {
 response(data.autocomplete.autocomplete_item[i].title.short)
}

, он действует как строка.Допустим, результат «Свингеры», он вернет:Object.value = sObject.value = wObject.value = я

и т. Д.

js:

$("#movies").autocomplete({
            source: function(request, response) {
          $.ajax({
             url: "<?php echo site_url();?>/welcome/search",
             dataType: "JSON",
             type:"POST",
             data: {
                q: request.term
             },
             success: function(data) { 
                for (var i in data.autocomplete.autocomplete_item) {
                 response(data.autocomplete.autocomplete_item[i].title.short);
                }

             }
          });
       }        
        }).data("autocomplete")._renderItem = function(ul, item) {
            //console.log(item);
        $(ul).attr('id', 'search-autocomplete');
           return $("<li class=\""+item.type+"\"></li>").data( "item.autocomplete", item ).append("<a href=\""+item.url+"\">"+item.title+"</a>").appendTo(ul);
        };

контроллер:

public function search(){
    $search = $this->input->post('q');
    // Run some setup
    $this->rest->initialize(array('server' => 'http://api.netflix.com/'));
    // set var equal to results
    $netflix_query = $this->rest->get('catalog/titles/autocomplete', array('oauth_consumer_key'=>$this->consumer_key,'term'=> $search,'output'=>'json'));

    //$this->rest->debug();

    //$json_data = $this->load->view('nice',$data,true);
        //return $json_data;

        echo json_encode($netflix_query);
    }

возврат json

{"autocomplete":
    {"autocomplete_item":[
       {"title":{"short":"The Strawberry Shortcake Movie: Sky's the Limit"}},
       {"title":{"short":"Futurama the Movie: Bender's Big Score"}},
       {"title":{"short":"Daffy Duck's Movie: Fantastic Island"}}
       ...

есть идеи?спасибо.

есть несколько консольных логов с возвратом URL

Ответы [ 3 ]

0 голосов
/ 21 августа 2011

Насколько я знаю, for (property in object) означает, что вы хотите получить доступ к каждому из его свойств, а не к ним через индекс. Если вы хотите получить к ним доступ через индекс, вы, вероятно, захотите использовать стандартный цикл for.

for (i = 0; i <= 10; i++) {
    response(data.autocomplete.autocomplete_item[i].title.short);
}

или, если вы все еще хотите использовать свой код, попробуйте это:

for (i in data.autocomplete.autocomplete_item) {
    response(i.title.short);
}

Я еще не тестировал их, но думаю, у вас есть идея.

0 голосов
/ 30 августа 2011

хорошо, я выяснил правильный формат, который мне нужно отправить в метод автозаполнения ответа:
вид

$("#movies").autocomplete({
        minLength: 2,
        source: function(request, response) {
            $.post("<?php echo base_url();?>welcome/search", {q: request.term}, 
               function(data){
                    //console.log(data);
                    response(data);

            }, 'json');
   }        
    });

контроллер:

$search = $this->input->post('q');
        // Run some setup
        $this->rest->initialize(array('server' => 'http://api.netflix.com/'));
        // Pull in an array
        $netflix_query = $this->rest->get('catalog/titles/autocomplete', array('oauth_consumer_key'=>$this->consumer_key,'term'=> $search,'output'=>'json'),'json');

        $json = array();
        foreach($netflix_query->autocomplete->autocomplete_item as $item){
            $temp = array("label" => $item->title->short);
            array_push($json,$temp);
        }
        echo json_encode($json);

необходимо было отправить обратно в представление массив объектов. Спасибо вам, ребята, за все ваши ответы и помощь !!

0 голосов
/ 21 августа 2011

in, как вы заметили, не делает то, что вы хотите с массивами.Используйте $.each

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...