Изменение выбора SelectField (s) с помощью JavaScript - PullRequest
0 голосов
/ 05 мая 2019

Я хочу визуализировать форму (используя Flask-WTForms) в зависимости от списка строк. Этот список строк указывает на DecimalField (s), а также на ключи с различными значениями в аргументе выбора SelectField. Цель состоит в том, чтобы отобразить (или несколько) DecimalField, скажем, Температура, а рядом с ним SelectField только с единицами температуры.

Вот как выглядит список кортежей для выбора SelectField и полей, которые будут определять то, что будет отображаться:

units_choices = [('temperature', '°C'), ('temperature', 'K'), ('temperature', '°F'), ('pressure', 'MPa'), ('pressure', 'bar'), ('pressure', 'psia'), ('fugacities', 'mol/l'), ('fugacities', 'mol/m3'), ('fugacities', 'g/ml'), ('fugacities', 'kg/m3')]
fields_to_show = ['temperature', 'pressure', 'fugacities']

Это мои декларации формы:

class UnitForm(FlaskForm):
    unit_field = FieldList(SelectField(label='', choices=units_choices))

class AnalysisForm(FlaskForm):
    temperature = DecimalField(label="Temperature")
    pressure = DecimalField(label="Pressure")
    fugacities = DecimalField(label="Fugacities")
    units = FieldList(FormField(UnitForm))

Это моя функция динамического просмотра, позволяющая выделить unit_choices по тем же клавишам:

@app.route('/units/<field>') 
def units(field):
    units_choices_new = [ (key, value) for (key, value) in units_choices if (key == field) ]
    units_array = []
    for unit in units_choices_new:
        unit_dict = {}
        unit_dict['key'] = unit[0]
        unit_dict['value'] = unit[1]
        units_array.append(unit_dict)
    return jsonify({'units': units_array})

А это мой HTML-рендеринг и код JS:

<div class="container">

    <form method="POST" class="form" role="form">
        {{ form.csrf_token }}
        {% for i in form.units %}
            {{ i.csrf_token }}
            {% for j in i.unit_field %}
                {{ wtf.form_field(j) }}
            {% endfor %}
        {% endfor %}
    </form>    

    <script>
        const field_select = {{ fields_to_show|safe }};

        for (let i=0; i < field_select.length; i++) {

            let field = field_select[i];
            let units_select = document.getElementById('units-'+i+'-unit_field-0');
            console.log(field); //print temperature, pressure and fugacities


            window.onload = function() { 

                fetch('/units/' + field).then(function(response) {
                    alert(field); //only shows fugacities :(
                    response.json().then(function(data) {
                        let optionHTML = '';                        
                        for (let unit of data.units) {
                            optionHTML += '<option value="' + unit.key + '">' + unit.value + '</option>';
                        }
                        units_select.innerHTML = optionHTML;
                    })     
                });
            }
        }

    </script>   
</div>

Я почти все заработал (работает нормально для одного поля), но когда две или более строки полей добавляются в список fields_to_show, устанавливается только последнее обещание, т. Е. Для этого примера обновляется только SelectField оператора fugacities. его фактические единицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...