Как заставить getSelectedCurrency работать только тогда, когда элемент select заполнен параметрами - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь вернуть выбранный в данный момент параметр из функции getSelectedCurrency, по умолчанию параметр выбора валюты выбран, но отключен.Теперь я пытаюсь заставить функцию возвращать выбранный в данный момент параметр, только когда есть другие параметры в элементах выбора и когда элемент выбора изменяется.

Я пытался добавить прослушиватель событий onchange, но не могу вернутьсячто-либо в самой функции, так как обработчики событий возвращают неопределенное значение по умолчанию, поэтому к моменту вызова getSelectedCurrency она не возвращает ничего, что мне не нужно.

Я также пытался добавить прослушиватель событий onchange вфункция populateCurrencies, позволяющая зарегистрировать событие достаточно рано .... но когда я вызываю getSelectedCurrency() сразу после его объявления (и после объявления populateCurrencies()), возвращается только значение по умолчанию (т. е. выберите текст валюты)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />

    <title>Mini App</title>

    <style>
        body{
            background-color:#fff;
            margin:15px;
            }
       .select{
            margin-top:50px;
        }
       .conversion{
            margin:25px 0px;
        }
       .btn{
            width:100%;
            font-size:1.2rem;
            padding:1rem;
           }
    </style>
</head>
<body>
    <h1>Naira Converted</h1>
    <div class="select-currency select">
        <select class="select-text">
            <option selected disabled>Select Currency</option>
        </select>
        <button type="submit" class="btn">In Naira</button>
        <div class="conversion mdc-elevation--z3"></div> 
        <div class="messages"></div>
    </div>
<script>
const currencies = [{
    id: 'USD', name: 'US Dollars'
  }, {
    id: 'UGX', name: 'Ugandan Shillings'
  }, {
    id: 'KES', name: 'Kenyan Shillings'
  }, {
    id: 'GHS', name: 'Ghanian Cedi'
  }, {
    id: 'ZAR', name: 'South African Rand'
  }];

  const apiBase = 'https://free.currencyconverterapi.com/api/v6/';
  const api = (currency) => `
    ${apiBase}convert?q=${currency}_NGN&compact=ultra
  `;

  const toast = (msg) => {
    const toastr = document.querySelector('.messages');
    if(!toastr) return;

    toastr.textContent = msg;
    if(!toastr.classList.contains('on')) {
      toastr.classList.add('on');
    }
  };

  const doneToasting = () => {
    const toastr = document.querySelector('.messages');
    if(!toastr) return;

    toastr.textContent = '';
    toastr.classList.remove('on');
  };

  const conversionSucceeded = (apiResponse) => {
    if(!apiResponse) {
      toast(`nothing to display ...`);
      return;
    }

    const [value] = Object.values(apiResponse)

    const btn = document.querySelector('button');
    btn.removeAttribute('disabled');

    const display = document.querySelector('.conversion');
    const formatter = new Intl.NumberFormat(
      'en-NG', { style: 'currency', currency: 'NGN' }
    );

    display.textContent = formatter.format(value);
    doneToasting();
  };
 // declare populateCurrencies here      
  const populateCurrencies = ()=>{
    currencies.forEach((x)=>{
      let elt = document.querySelector('.select-text');
      let newElt = document.createElement('option');
      let newText = document.createTextNode(x.name);
      newElt.appendChild(newText);
      newElt.setAttribute('value',x.id);
      elt.appendChild(newElt);
    })
      let elt = document.querySelector('.select-text');
    elt.addEventListener('change',()=>{
       let currentlySelected =document.querySelector('[selected]');
       currentlySelected.removeAttribute('selected');
       elt.selectedOptions[0].setAttribute('selected','');
      console.log(getSelectedCurrency());
      },false)
    }
   const getSelectedCurrency=()=>{
    // here, determine and return the selected value 
    // of the SELECT element
    let currentlySelected= document.querySelector('.select-text');
    let value= currentlySelected.selectedOptions[0].textContent;
    return(value) ;
  };
  const selected = getSelectedCurrency();
  console.log(selected);
  const convert = (event) => {
    toast(`preparing to convert ...`);

    const btn = event ? 
          event.target : document.querySelector('button');

    const selected = getSelectedCurrency();

    if(!selected || selected.trim() === '' 
       || !currencies.map(c => c.id).includes(selected)) return;

    btn.setAttribute('disabled', 'disabled');
    toast(`converting ...`);

    const endpoint = api(selected);

    // make a GET fetch call to the endpoint
    // variable declared above, convert the response to JSON,
    // then call conversionSucceeded and pass the JSON data to it
  };

  const startApp = () => {
    // call populateCurrencies here
    populateCurrencies();
    // add a click listener to the button here
    document.querySelector('button').addEventListener('click',(event)=>       
    {convert(event)},false);
  };
  startApp();
        </script>
     </body>
</html>

Я ожидаю, что вызов getSelectedCurrency должен вернуть текущую выбранную опцию, и когда изменение произойдет, оно также должно вернуть это изменение, но оно вернет только значение по умолчанию.

1 Ответ

0 голосов
/ 13 февраля 2019

Совершено куча вещей, вы несколько раз выбирали элементы управления, а также получали text или select вместо value для преобразования.

Теперь все готово для вас.добавьте свой код вызова API.

const currencies = [{
  id: 'USD',
  name: 'US Dollars'
}, {
  id: 'UGX',
  name: 'Ugandan Shillings'
}, {
  id: 'KES',
  name: 'Kenyan Shillings'
}, {
  id: 'GHS',
  name: 'Ghanian Cedi'
}, {
  id: 'ZAR',
  name: 'South African Rand'
}];

const apiBase = 'https://free.currencyconverterapi.com/api/v6/';
const api = (currency) => `${apiBase}convert?q=${currency}_NGN&compact=ultra`;

const toast = (msg) => {
  const toastr = document.querySelector('.messages');
  if (!toastr) return;

  toastr.innerText = msg;
  toastr.classList.add('on');
};

const doneToasting = () => {
  const toastr = document.querySelector('.messages');
  if (!toastr) return;

  toastr.innerText = '';
  toastr.classList.remove('on');
};

const conversionSucceeded = (apiResponse) => {
  if (!apiResponse) {
    toast(`nothing to display ...`);
    return;
  }

  const [value] = Object.values(apiResponse)

  const btn = document.querySelector('button');
  btn.removeAttribute('disabled');

  const display = document.querySelector('.conversion');
  const formatter = new Intl.NumberFormat(
    'en-NG', {
      style: 'currency',
      currency: 'NGN'
    }
  );

  display.innerText = formatter.format(value);
  doneToasting();
};

// declare populateCurrencies here      
const populateCurrencies = () => {
  let elt = document.querySelector('.select-text');
  currencies.forEach((x) => {
    let newElt = document.createElement('option');
    newElt.text = x.name;
    newElt.value = x.id;
    elt.add(newElt);
  })
  elt.addEventListener('change', () => {
    console.log(getSelectedCurrency());
  }, false)
};

const getSelectedCurrency = () => {
  // here, determine and return the selected value 
  // of the SELECT element
  let currentlySelected = document.querySelector('.select-text');
  let value = currentlySelected.selectedOptions[0].value;
  return (value);
};

const selected = getSelectedCurrency();
console.log(selected);

const convert = (event) => {
  toast(`preparing to convert ...`);

  const btn = event ?
    event.target : document.querySelector('button');

  const selected = getSelectedCurrency();
  toast(`converting for currency: ${selected}`);

  if (!selected || selected.trim() === '' ||
    !currencies.map(c => c.id).includes(selected)) return;

  btn.setAttribute('disabled', 'disabled');
  toast(`converting ...`);

  const endpoint = api(selected);

  // Need to add your API call now.
  console.log(endpoint);

  // make a GET fetch call to the endpoint
  // variable declared above, convert the response to JSON,
  // then call conversionSucceeded and pass the JSON data to it
};

const startApp = () => {
  // call populateCurrencies here
  populateCurrencies();
  // add a click listener to the button here
  document.querySelector('button').addEventListener('click', (event) => {
    convert(event)
  }, false);
};
startApp();
body {
  background-color: #fff;
  margin: 15px;
}

.select {
  margin-top: 50px;
}

.conversion {
  margin: 25px 0px;
}

.btn {
  width: 100%;
  font-size: 1.2rem;
  padding: 1rem;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Mini App</title>
</head>

<body>
  <h1>Naira Converted</h1>
  <div class="select-currency select">
    <select class="select-text">
      <option selected disabled>Select Currency</option>
    </select>
    <button type="submit" class="btn">In Naira</button>
    <div class="conversion mdc-elevation--z3"></div>
    <div class="messages"></div>
  </div>
</body>

</html>
...