Как загрузить более одного автозаполнения в framework7?

Я изучаю framework7. Моя проблема в том, что: на мой взгляд, мне нужно включить больше автозаполнения, но я не могу загрузить все.

Я использую раскрывающийся список с данными Ajax + Typeahead https://framework7.io/docs/autocomplete.html

мой html

<li class="item-content item-input">
<div class="item-inner">
    <div class="item-title item-label">Language1</div>
    <div class="item-input-wrap">
        <input id="autocomplete-dropdown-ajax-typeahead" type="text" placeholder="" name="language1">
    </div>
</div>
</li>
<li class="item-content item-input">
<div class="item-inner">
    <div class="item-title item-label">Language2</div>
    <div class="item-input-wrap">
        <input id="autocomplete-dropdown-ajax-typeahead" type="text" placeholder="" name="language2">
    </div>
</div>
</li>

<li class="item-content item-input">
<div class="item-inner">
    <div class="item-title item-label">Language3</div>
    <div class="item-input-wrap">
        <input id="autocomplete-dropdown-ajax-typeahead" type="text" placeholder="" name="language3">
    </div>
</div>
</li>

Я поместил код js в js/pages/languages/languages.js и таким образом включил его в index.html.

<script type="text/javascript" src="js/pages/languages/languages.js"></script>

языки.js

const languages1 = () => {
 var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({
inputEl: '#autocomplete-dropdown-ajax-typeahead',
openIn: 'dropdown',
preloader: true, //enable preloader
/* If we set valueProperty to "id" then input value on select will be set according to this property */
valueProperty: 'name', //object's "value" property name
textProperty: 'name', //object's "text" property name
//limit: 20, //limit to 20 results
typeahead: true,
dropdownPlaceholderText: 'Type...',
source: function (query, render) {
  var autocomplete = this;
  var results = [];
  if (query.length === 0) {
    render(results);
    return;
  }
  // Show Preloader
  autocomplete.preloaderShow();

// Do Ajax request to Autocomplete data
app.request({
  url: 'js/data/languages/languages1.json',
  method: 'GET',
  dataType: 'json',
  //send "query" to server. Useful in case you generate response dynamically
  data: {
    query: query,
  },
  success: function (data) {
    // Find matched items
    for (var i = 0; i < data.length; i++) {
      if (data[i].name.toLowerCase().indexOf(query.toLowerCase()) === 0) results.push(data[i]);
    }
    // Hide Preoloader
    autocomplete.preloaderHide();
    // Render items by passing array with result items
    render(results);
  }
});
}});}

const languages2 = () => {

var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({
inputEl: '#autocomplete-dropdown-ajax-typeahead',
openIn: 'dropdown',
preloader: true, //enable preloader
/* If we set valueProperty to "id" then input value on 
select will be set according to this property */
valueProperty: 'name', //object's "value" property name
textProperty: 'name', //object's "text" property name
limit: 20, //limit to 20 results
typeahead: true,
dropdownPlaceholderText: 'Type...',
source: function (query, render) {
 var autocomplete = this;
 var results = [];
if (query.length === 0) {
  render(results);
  return;
}
// Show Preloader
autocomplete.preloaderShow();

// Do Ajax request to Autocomplete data
app.request({
  url: 'js/data/languages/languages2.json',
  method: 'GET',
  dataType: 'json',
  //send "query" to server. Useful in case you generate response dynamically
  data: {
    query: query,
  },
  success: function (data) {
    // Find matched items
    for (var i = 0; i < data.length; i++) {
      if (data[i].name.toLowerCase().indexOf(query.toLowerCase()) === 0) results.push(data[i]);
    }
    // Hide Preoloader
    autocomplete.preloaderHide();
    // Render items by passing array with result items
    render(results);
  }
});
}});}

const languages3 = () => {

var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({
inputEl: '#autocomplete-dropdown-ajax-typeahead',
openIn: 'dropdown',
preloader: true, //enable preloader
/* If we set valueProperty to "id" then input value 
on select will be set according to this property */
valueProperty: 'name', //object's "value" property name
textProperty: 'name', //object's "text" property name
limit: 20, //limit to 20 results
typeahead: true,
dropdownPlaceholderText: 'Type...',
source: function (query, render) {
  var autocomplete = this;
  var results = [];
  if (query.length === 0) {
    render(results);
    return;
  }
// Show Preloader
autocomplete.preloaderShow();

// Do Ajax request to Autocomplete data
app.request({
  url: 'js/data/languages/languages3.json',
  method: 'GET',
  dataType: 'json',
  //send "query" to server. Useful in case you generate response dynamically
  data: {
    query: query,
  },
  success: function (data) {
    // Find matched items
    for (var i = 0; i < data.length; i++) {
      if (data[i].name.toLowerCase().indexOf(query.toLowerCase()) === 0) results.push(data[i]);
    }
    // Hide Preoloader
    autocomplete.preloaderHide();
    // Render items by passing array with result items
    render(results);
  }
});
}});}

и я вызываю элементы автозаполнения в my-app.js

 {
    name: '',
    path: '',
    url: '',
    routes: [

      {
        name: 'languages',
        path: 'languages/',
        url: './pages/languages/languages.html',
        on: {
            pageInit: languages1,
                      languages2,
                      languages3

            }
      }]
 },

но это не работает. Он работает только один, если я прокомментирую два других.

Спасибо за помощь!


person Paul    schedule 28.10.2018    source источник


Ответы (1)


Ваша основная проблема с селектором идентификаторов. У вас есть 3 идентификатора с именем autocomplete-dropdown-ajax-typeahead, селектор идентификаторов чаще всего ссылается только на один элемент, чтобы он работал правильно, чтобы исправить это, вы можете сделать это:

<li class="item-content item-input">
<div class="item-inner">
    <div class="item-title item-label">Language1</div>
    <div class="item-input-wrap">
        <input id="autocomplete-dropdown-ajax-typeahead-1" type="text" placeholder="" name="language1">
    </div>
</div>
</li>
<li class="item-content item-input">
<div class="item-inner">
    <div class="item-title item-label">Language2</div>
    <div class="item-input-wrap">
        <input id="autocomplete-dropdown-ajax-typeahead-2" type="text" placeholder="" name="language2">
    </div>
</div>
</li>

<li class="item-content item-input">
<div class="item-inner">
    <div class="item-title item-label">Language3</div>
    <div class="item-input-wrap">
        <input id="autocomplete-dropdown-ajax-typeahead-3" type="text" placeholder="" name="language3">
    </div>
</div>
</li>

Также вам нужно отредактировать languages.js, чтобы каждый El ссылался на ваш целевой идентификатор:

const languages1 = () => {
 var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({
inputEl: '#autocomplete-dropdown-ajax-typeahead-1',...

const languages2 = () => {
     var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({
    inputEl: '#autocomplete-dropdown-ajax-typeahead-2',...

Асинхронный маршрут:

routes: [
  {
    name: 'languages',
    path: 'languages/',            
    async(routeTo, routeFrom, resolve, reject) {
      // You can put you condition to make sure all languages are fill                  then resolve url
      // For test reason you can create setInterval function thats keep             check value, when success remove interval and go to resolve
      var checkTimer = setInterval(function(){ 
        if(languages1 && languages2 && languages3){
          clearInterval(checkTimer);
          resolve({
            url: './pages/languages/languages.html',
          });
        }
      }, 500);        
    }
  }]

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

Пример кода из Интернета

person Anees Hikmat Abu Hmiad    schedule 28.10.2018
comment
Спасибо за помощь. Я изменил идентификатор, но он все еще не работает. Работает только первый autocomplete-dropdown-ajax-typeahead-1. Потому что я вызываю его перед двумя другими в my-app-json: languages1, languages2, languages3. Если я изменю порядок, например, языки2, языки1, языки3.. языки2 работают, а другие нет - person Paul; 28.10.2018
comment
Добро пожаловать, приятель, я думаю, что теперь эта проблема, поскольку страница загружается до завершения другого запроса... так что вы можете использовать (асинхронный маршрут)... framework7.io/docs/routes.html#async-route - person Anees Hikmat Abu Hmiad; 28.10.2018
comment
Можете ли вы написать мне пример? - person Paul; 28.10.2018
comment
Я редактирую свой ответ, и я добавляю пример для асинхронного маршрута: D - person Anees Hikmat Abu Hmiad; 28.10.2018
comment
Извините, я этого не видел :D но это странно, потому что таким образом оба не работают - person Paul; 28.10.2018
comment
LOL, NP, не могли бы вы проверить, есть ли какие-либо ошибки в моей консоли? также, пожалуйста, console.log(lang1, lang2, lang3)... внутри setInterval... чтобы проверить значение langs - person Anees Hikmat Abu Hmiad; 28.10.2018
comment
он пишет: () => { var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({ inputEl: '#autocomplete-dropdown-ajax-typeahead-1', openIn: 'dropdown', preloader: true, //включить предварительный загрузчик /* Если мы устанавливаем val… my-app.js:116 () =› { var autocompleteDropdownAjaxTypeahead = app.autocomplete.create({ inputEl: '#autocomplete-dropdown-ajax-typeahead-2', openIn: 'dropdown', preloader: true , //включаем предварительный загрузчик /* Если мы установим va… - person Paul; 29.10.2018
comment
Я пишу для вас реальный пример без дополнительных вариантов, приятель... проверьте ссылку на скрипку в моем ответе.. обратите внимание, я меняю имя на заголовок... так как я использую онлайн-тест API... Также обратите внимание... созданное имя переменной должно быть также 1,2, 3 .. так как в autocompleteDropdownAjaxTypeahead переопределяется autocompleteDropdownAjaxTypeahead...и т.д. - person Anees Hikmat Abu Hmiad; 29.10.2018
comment
Спасибо за ваше терпение! Я решил проблему следующим образом: on: { pageInit: function(){ languages1(); языки2(); языки3(); } } - person Paul; 29.10.2018