Функция OnClick в модулях / классах не работает

#javascript #html-framework-7

#javascript #html-framework-7

Вопрос:

Сейчас я создаю свое первое приложение с framework7.io , также с помощью javascript. Я не совсем новичок в работе с javascript.

Моя проблема сейчас в том, что я хочу иметь динамическую onClick функцию, которая создается внутри класса javascript. Но onClick событие не запускается.

Я использую webpack для своего javascript

Когда у меня все в app.js нем работало. Теперь я хочу сделать свое приложение более похожим на ООП, поэтому я реализовал свои классы и импортировал их.

Проблема в том, что событие onClick не запускается. Я попробовал это с идентификатором, но тоже не работает. Также проблемой является this контекст.

Я думаю, что проблема как-то связана с маршрутом. Для некоторой onChange функциональности я должен поместить код в pageInit внутри app.js того, что тогда работало.

Я попробовал то же самое с onClick представлением по умолчанию. Потому что мне нужно это событие на сайте / просмотре по умолчанию.

Мое приложение структурировано следующим образом:

У меня есть app.js что такое индексный файл. Здесь я включаю все классы / модули, которые мне нужны

Вот так:

 'use strict';

require('./framework7-4.2.2.bundle');
var config = require('./config');

var functions = require('./functions');


import RealEstate from './real_estate.js';

let real_estates = new RealEstate();
real_estates.loadDefaultRealEstates();

// Dom7
var $ = Dom7;

// Framework7 App main instance
var app = new Framework7({ ....
 

Мой real_estate.js

 ...

createRealEstatesCard(data) {
        functions.setOutPut('Called createRealEstatesCard(); with data ... ');
        functions.setOutPut(data);

        let fav = this.getRealEstateFavoritesStatus(data['real_estate_id']);

        if(fav) {
            fav = '<i data-real-estate-id="'  data['real_estate_id']  '" class="real-estate-fav material-icons">favorite</i>';
        } else fav = '<i data-real-estate-id="'  data['real_estate_id']  '" class="real-estate-fav material-icons">favorite_border</i> <button class="test">Test</button>';

        return ('<div class="card card-expandable">'  
            '              <div class="card-content">'  
            '                <div class="bg-color-red" style="height: 300px">'  
            '                  <div class="card-header text-color-white display-block">'   
            '                     <img src="'  data['real_estate_featured_image']  '">'  
            '                    ' fav ''  
            '                    <p style="font-size: 0.8em; width: 90%;">'   data['real_estate_title']   '</p>'  
            '                  </div>'  
            '                  <a href="#" class="link card-close card-opened-fade-in color-white" style="position: absolute; right: 15px; top: 15px">'  
            '                    <i class="icon f7-icons">close_round_fill</i>'  
            '                  </a>'  
            '                </div>'  
            '                <div class="card-content-padding">'  
            '<p></p>'  
            '                  <p>Preis: <strong>'   data['real_estate_price']   ' € </strong></br>'  
            '                   Terms: <strong>'   data['real_estate_terms']  '</strong></br>'  
            '                   Zimmer: <strong>'   data['real_estate_rooms']  '</strong></br>'  
            '<a class="link" href="/real_estate/show/'   data['real_estate_id']   '/">Detail view</a></p>'  
            '                </div>'  
            '              </div>'  
            '            </div>');
    }
...
 

Я пробовал это следующим образом:

app.js

 var app = new Framework7({
    root: '#app', // App root element
    id: 'io.framework7.testapp', // App bundle ID
    name: 'XXXXXX', // App name
    theme: 'auto', // Automatic theme detection
    //* App routes */
    routes: [
        {
            path: '/',
            url: './index.html',
            on: {
                pageInit: function (event, page) {

                    var router = this;

                    /* remove sidebar */
                    router.app.panel.close('left');

                    $('.test').on('click', function (e) {
                        functions.setOutPut('.real-estate-fav');
                    });
                },
            }
        },
 

Внутренняя real_estate.js

 createRealEstatesCard(data) {
        functions.setOutPut('Called createRealEstatesCard(); with data ... ');
        functions.setOutPut(data);

        let fav = this.getRealEstateFavoritesStatus(data['real_estate_id']);

        if(fav) {
            fav = '<i data-real-estate-id="'  data['real_estate_id']  '" class="real-estate-fav material-icons">favorite</i>';
        } else fav = '<i data-real-estate-id="'  data['real_estate_id']  '" class="real-estate-fav material-icons">favorite_border</i> <button class="test">Test</button>';

        return ('<div class="card card-expandable">'  
            '              <div class="card-content">'  
            '                <div class="bg-color-red" style="height: 300px">'  
            '                  <div class="card-header text-color-white display-block">'   
            '                     <img src="'  data['real_estate_featured_image']  '">'  
            '                    ' fav ''  
            '                    <p style="font-size: 0.8em; width: 90%;">'   data['real_estate_title']   '</p>'  
            '                  </div>'  
            '                  <a href="#" class="link card-close card-opened-fade-in color-white" style="position: absolute; right: 15px; top: 15px">'  
            '                    <i class="icon f7-icons">close_round_fill</i>'  
            '                  </a>'  
            '                </div>'  
            '                <div class="card-content-padding">'  
            '<p></p>'  
            '                  <p>Preis: <strong>'   data['real_estate_price']   ' € </strong></br>'  
            '                   Terms: <strong>'   data['real_estate_terms']  '</strong></br>'  
            '                   Zimmer: <strong>'   data['real_estate_rooms']  '</strong></br>'  
            '<a class="link" href="/real_estate/show/'   data['real_estate_id']   '/">Detail view</a></p>'  
            '                </div>'  
            '              </div>'  
            '            </div>');
    }
 

Функция functions.setOutPut();" works fine. It also has no output with console.log();» когда я нажимаю кнопку проверки
Возможно, у вас есть предложения. Если вам нужно больше кода, просто спросите, пожалуйста 😉

Ответ №1:

Решение:

Важно использовать подобные функции в функциях маршрутизатора OnPage. Card находится в framework7 особенность: вы должны поместить код внутри события экземпляра cardOpen.