2013-09-28 3 views
0

typeahead.js работает хорошо, когда результаты возвращаются будет массив:Как предварительно обрабатывать результаты typeahead.js json перед тем, как перейти к шаблонам (hogan.js)?

var simpleCountriesList = [ 
    "Andorra", 
    "United Arab Emirates", 
    "Afghanistan", 
    "Antigua and Barbuda" 
    ]; 

В моем случае, есть массив объектов, но он обернут в объекте, как это:

var countryObjectsWrappedInResults = { 
    "results":[ 
     { 
     "name":"Andorra" 
     }, 
     { 
     "name":"United Arab Emirates" 
     }, 
     { 
     "name":"Afghanistan" 
     }, 
     { 
     "name":"Antigua and Barbuda" 
     } 
    ] 
}; 

или

{ 
    "maintainers":[ 
     { 
     "name":"Jake Harding", 
     "url":"https://twitter.com/JakeHarding" 
     }, 
     { 
     "name":"Tim Trueman", 
     "url":"https://twitter.com/timtrueman" 
     }, 
     { 
     "name":"Veljko Skarich", 
     "url":"https://twitter.com/vskarich" 
     } 
    ] 
} 

Я создал небольшую jsbin, чтобы проиллюстрировать эту проблему как с локальным и удаленным: http://jsbin.com/OseWeKA/5/edit

Я переношусь из bootstrap typeahead, где я смог использовать updater, чтобы вытащить массив из результатов. Что эквивалентно для twitter.js?

ответ

2

Добавить 'фильтр:' в ваш удаленный набор данных. Что-то вроде:

remote: { 
    url: '...', 
    filter: function (response) { 
     retval = []; 
     for (var i = 0; i < response.maintainers.length; i++) { 
      retval.push(response.maintainers[i].name); 
     } 
     return retval; 
    }, 
} 

filter превращает ваш удаленный ответ на массив датумов.

Независимо от того, что ваша скрипка не работает, потому что ваш сервер не поддерживает JSONP, где, как вы четко указываете dataType: "jsonp". Ваш сервер также возвращает text/plain как Content-Type, где как должно возвращать скрипт. Я полагаю, что в вашей «живой» системе нет реальных проблем.

+0

Спасибо Nitzan, фильтр - правильный подход, но мне нужно использовать шаблон и присоединиться к нескольким полям, и мой прекомпилированный шаблон кажется неудачным. Я нашел следующий пример: var template = Hogan.compile ("/% name% /", {delimiters: '/%% /'}), precompiled = function (context) {template.render (context); }; но что-то кажется неправильным. Вы знакомы с шаблонами? Знаете ли вы, чего не хватает? – JStark

+0

В любом случае используйте шаблон, но его не нужно предварительно прекомпилировать. Просто передайте строку, такую ​​как '{{name}} - {{other_field}}' или что-то в этом направлении. Независимо от того, ответ на ваш вопрос - 'filter:'. –

0

Я предлагаю взломать это.

var newCountrylist = []; 
$.each(countryObjectsWrappedInResults.results , function(k , v){ 
    newCountrylist.push(v.name); 
    }); 
+0

В моем примере jsbin используется «local», но в моем реальном приложении я использую «remote», поэтому мне нужно обработать результаты, возвращаемые с сервера. Где я могу обработать эти результаты? – JStark

+0

в обратном вызове ajax-запроса .. пожалуйста, отправьте код, чтобы я мог получить лучшую идею. –

+0

Я обновил jsbin, чтобы включить третий пример, который использует «remote» – JStark

 Смежные вопросы

  • Нет связанных вопросов^_^