Onsen 2.0 — Добавление прослушивателя событий в Ons-Switch с помощью Javascript

Боюсь, я упускаю что-то очень простое, но я пробовал несколько попыток с разными ошибками. К коду:

<script>
        document.getElementById("optStats").on("change", function(e) {
    alert("Switch changed!");
  });
    </script>
<ons-switch modifier="list-item" id="optStats"></ons-switch>

Так что вышеописанное не работает. Выдает ошибку Uncaught TypeError: Cannot read property of on of null. Поэтому я предположил, что мне нужно добавить функцию в функцию инициализации загрузки, но она все равно не удалась с той же ошибкой.

Я пробовал все варианты, перечисленные здесь: https://onsen.io/guide/overview.html#EventHandling безуспешно. Это будет включать использование var вместо id и почти все остальное, что, по моему мнению, будет работать.

Изменить: полный код, который не работает, но работает в codepen без тега шаблона.

<ons-template id="options.html" >
        <ons-page>
            <ons-toolbar>
                <div class="center">Options</div>
            </ons-toolbar>         
            <ons-list modifier="inset" style="margin-top:10px;">
                <ons-list-item>
                  Detailed Stats
                  <ons-switch modifier="list-item" id="optStats"></ons-switch>
                </ons-list-item>
            </ons-list>            
        </ons-page>
    </ons-template>

Я использую это в ons.ready() и пробовал снаружи, что приводит к той же ошибке, cannot read property of addEventListener, как указано выше для обоих.

document.getElementById('optStats').addEventListener('change', function(e) {
      console.log('click', e.target.checked);
    });

Последнее обновление Клянусь: НАКОНЕЦ-ТО!!!! Спасибо, @Fran-dios!

После работы с этим init — это не то событие, которое вы хотите использовать, вы определенно хотите использовать show для того, что я пытался сделать.

document.addEventListener("show", function(event){
    if (event.target.id == "pgOptions") { 
        document.getElementById('optStats').addEventListener('change', function(e) {
            localStorage.setItem('useDetailedStats', e.target.checked); 
            useDetailedStats = e.target.checked;
        });
        document.getElementById('optStats').setChecked(useDetailedStats);
      } 
},false);

По какой-то причине при использовании init на <ons-tabbar> всякий раз, когда вы нажимали вкладку, это приводило к изменению состояния переключателя. При использовании show это не так. Кроме того, когда я регистрировал действие инициализации, страница, даже если она не отображалась при запуске приложения, все равно дважды регистрировалась как инициализирующая. Шоу не вызывает этого. В любом случае код, предоставленный @fran-dios, является правильной основой для получения того, что мне нужно, и его ответ по-прежнему правильный, мне просто нужно было использовать другое событие.


person Munsterlander    schedule 01.02.2016    source источник


Ответы (1)


Боюсь, вы правы. Возможно, вы хотите использовать addEventListener JS, а не чем jQuery on. Остальное должно быть правильно.

Обновление:

Очень простой пример: http://codepen.io/frankdiox/pen/WrKjew

<ons-page>
  <ons-switch id="mySwitch"></ons-switch>
</ons-page>
-----
document.getElementById('my-switch').addEventListener('change', function(e) {
  console.log('click', e);
});

Обновление 2:

Настоящая проблема заключается в инициализации страниц в Onsen UI 2. Лучший способ — использовать жизненный цикл страницы события, в частности init событие.

document.addEventListener("init", function(event) {
  if (event.target.id == "my-page") {
    document.getElementById("my-switch").addEventListener('change', function(e) {
      console.log('click', e);
    });
  }
}, false);
person Fran Dios    schedule 01.02.2016
comment
Я поместил document.getElementById("optStats").addEventListener("change", function(){ alert('t'); }); в функцию ons.ready(), чтобы убедиться, что DOM загружен, и это приводит к аналогичной ошибке, за исключением cannot read property of addEventListener. Итак, если это не сработает, что бы вы сказали, это лучший способ сохранить настройки переключателей, а затем загрузить / выйти (нажать / поп) экрана? - person Munsterlander; 01.02.2016
comment
@Munsterlander Я добавил пример. Убедитесь, что вы нашли что-то с getElementById. Возможно, ваш коммутатор не подключен к DOM? - person Fran Dios; 02.02.2016
comment
Я проверил и подтвердил. Что странно, я скопировал свой код в ваш пример, и он работает, но не в моем приложении. Я получаю ту же ошибку в моем приложении, как указано выше. Я в тупике. - person Munsterlander; 02.02.2016
comment
Не будет ли это работать в шаблоне? - person Munsterlander; 02.02.2016
comment
Нет, если вы не отправили содержимое этого шаблона раньше. Шаблоны похожи на разные html-файлы, их содержимое не привязано к DOM, поэтому вы не можете найти его с помощью getElementById. - person Fran Dios; 02.02.2016
comment
Я только что проверил это и возвращался, чтобы сказать это. Извините, что потратил на это время всех. Я знаю, что это совершенно другой вопрос, но как вы можете отправить содержимое шаблона заранее? Я использую панель вкладок и имею вкладку параметров. Нужно ли мне вызывать loadPage()? Если да, то когда именно вы это сделаете в ons.ready(), а затем добавите слушателя? - person Munsterlander; 02.02.2016
comment
Я пробовал: document.getElementById('myTabBar').loadPage('options.html'); document.getElementById('mySwitch').addEventListener('change', function(e) { alert('yay'); }); Страница загружается, но ошибка все еще сохраняется, говоря, что объект DOM не существует. Есть ли способ сделать обратный вызов для pageLoad()? - person Munsterlander; 02.02.2016
comment
Содержимое шаблона прикрепляется к DOM всякий раз, когда вы их используете. Например, на панели вкладок, если вы нажмете на вкладку, она внутренне вызовет loadPage и прикрепит связанную страницу к DOM. Я считаю, что вы хотите инициализировать страницу с пользовательскими данными/поведением, поэтому, пожалуйста, прочитайте это: onsen.io/guide/overview.html#Pagelifecycle - person Fran Dios; 02.02.2016
comment
Событие init запускается, когда страница готова и прикреплена, поэтому просто прослушивайте события init (вы можете добавить прослушиватель к элементу панели вкладок или непосредственно к документу), а затем настройте свои материалы на этой странице. - person Fran Dios; 02.02.2016
comment
Благодарю вас! Я буду работать с этим. Я был немного выше в документах и ​​не сделал это так далеко. Я думаю, что это сделает то, что мне нужно. Все остальное терпит неудачу, используйте кнопку, чтобы сохранить! ХА! Извините, потратил весь день на это и на диаграмму, связанную с этой проблемой. Какое отстойное время для того, чтобы не читать документы достаточно далеко. - person Munsterlander; 02.02.2016
comment
Функция инициализации вызвала очень уникальную ошибку. Переключив его на отображение, он решает эту проблему. Я обновил вопрос, чтобы показать новый код. - person Munsterlander; 08.02.2016