Javascript 如果只有一个,它就会再次失败。我已经将函数更新为具有参数,然后将要更新的字段作为参数传递给函数。我用这个新代码编辑了这些问题。有什么想法吗?我不太清楚你的新要求是什么。表格和字段如何相互关联?我强烈建议你发布一个关于这个的新问题,可能是一个简单的工作sta
Javascript 如果只有一个,它就会再次失败。我已经将函数更新为具有参数,然后将要更新的字段作为参数传递给函数。我用这个新代码编辑了这些问题。有什么想法吗?我不太清楚你的新要求是什么。表格和字段如何相互关联?我强烈建议你发布一个关于这个的新问题,可能是一个简单的工作sta,javascript,python,jquery,wtforms,Javascript,Python,Jquery,Wtforms,如果只有一个,它就会再次失败。我已经将函数更新为具有参数,然后将要更新的字段作为参数传递给函数。我用这个新代码编辑了这些问题。有什么想法吗?我不太清楚你的新要求是什么。表格和字段如何相互关联?我强烈建议你发布一个关于这个的新问题,可能是一个简单的工作stackblitz。无论如何,你的语法还是不正确的。您正在updateFields()上定义两个参数:表和字段。但是你根本没有在函数体中使用它们。第一次这样调用函数时:updateFields(table,field)。您试图传递给函数的这两个参数
如果只有一个,它就会再次失败。我已经将函数更新为具有参数,然后将要更新的字段作为参数传递给函数。我用这个新代码编辑了这些问题。有什么想法吗?我不太清楚你的新要求是什么。
表格
和字段
如何相互关联?我强烈建议你发布一个关于这个的新问题,可能是一个简单的工作stackblitz。无论如何,你的语法还是不正确的。您正在updateFields()
上定义两个参数:表和字段。但是你根本没有在函数体中使用它们。第一次这样调用函数时:updateFields(table,field)
。您试图传递给函数的这两个参数是在哪里定义的?也许我得到了,请参阅更新的答案。@Ibsn,是的,这就是我试图做的。多谢!后续问题-由于用户尚未在表单中输入任何内容,对updateFields()的第一次调用是否会以零更新字段?
class QaForm(FlaskForm):
test_table_in = StringField('Test Table', validators=[DataRequired()], id= 'test_table')
test_join_key = SelectMultipleField("Select Test Fields to Join on", choices=[], coerce=str, id = 'select_test_join_key')
@app.route('/', methods = ['GET', 'POST'])
@app.route('/home', methods = ['GET', 'POST'])
def home():
form = QaForm()
fields_query = f"""select column_name AS Fields from information_schema.columns group by 1;"""
conn.execute(fields_query)
result = conn.fetchall()
select_choices = [(column, column) for column in result]
form.test_join_key.choices = select_choices
@app.route('/_get_fields/<table>')
def _get_fields(table):
table = request.args.get(table, type=str)
fields_query = f"""select column_name AS Fields from information_schema.columns WHERE table_name = '{table}' group by 1;"""
conn.execute(fields_query)
result = conn.fetchall()
select_choices = [(column, column) for column in result]
return jsonify(select_choices)
<script charset="utf-8" type="text/javascript">
$function() {
var dropdown = {
test_table: $('#test_table')
test_join_key: $('#select_test_join_key')
}
updateFields();
function updateFields() {
var send = {
test_table: dropdown.test_table.val()
};
dropdown.test_join_key.attr('disabled', 'disabled');
dropdown.test_join_key.empty();
$.getJSON("{{url_for('_get_fields') }}", send, function(data) {
data.forEach(function(item) {
dropdown.test_join_key.append(
$('<option>', {
value: item[0],
text: item[1]
})
);
});
dropdown.test_join_key.removeAttr('disabled');
});
}
dropdown.test_table.on('change', function() {
updateFields();
});
});
</script>
<script charset="utf-8" type="text/javascript">
$(function() {
var tables = {
test_table: $('#test_table'),
prod_table: $('#prod_table')
};
var fields = {
test_join_key: $('#select_test_join_key'),
prod_join_key: $('#select_prod_join_key'),
test_dimensions: $('#select_test_dimensions'),
prod_dimensions: $('#select_prod_dimensions'),
test_measures: $('#select_test_measures'),
prod_measures: $('#select_prod_measures')
};
updateFields(table, field);
function updateFields(table, field) {
var send = {
table: tables.table.val()
};
fields.field.attr('disabled', 'disabled');
fields.field.empty();
$.getJSON("{{url_for('_get_fields') }}", send, function(data) {
data.forEach(function(item) {
fields.field.append(
$('<option>', {
value: item[1],
text: item[0]
})
);
});
fields.field.removeAttr('disabled');
});
}
tables.test_table.on('change', function() {
updateFields(tables.test_table, fields.test_join_key);
updateFields(tables.test_table, fields.test_dimensions);
updateFields(tables.test_table, fields.test_measures);
});
tables.prod_table.on('change', function() {
updateFields(tables.prod_table, fields.prod_join_key);
updateFields(tables.prod_table, fields.prod_dimensions);
updateFields(tables.prod_table, fields.prod_measures);
});
});
<script charset="utf-8" type="text/javascript">
$(function(){
var dropdown = {
test_table: $('#test_table'),
test_join_key: $('#select_test_join_key')
}
updateFields();
function updateFields() {
var send = {
test_table: dropdown.test_table.val()
};
dropdown.test_join_key.attr('disabled', 'disabled');
dropdown.test_join_key.empty();
$.getJSON("{{url_for('_get_fields') }}", send, function(data) {
data.forEach(function(item) {
dropdown.test_join_key.append(
$('<option>', {
value: item[0],
text: item[1]
})
);
});
dropdown.test_join_key.removeAttr('disabled');
});
}
dropdown.test_table.on('change', function() {
updateFields();
});
});
$(function () {
var tables = {
test_table: $('#test_table'),
prod_table: $('#prod_table')
};
// I'm organizing fields in two arrays, test and prod, for simplyfing iterate over each group
var fields = {
test: [$('#select_test_join_key'), $('#select_test_dimensions'), $('#select_test_measures')],
prod: [$('#select_prod_join_key'), $('#select_prod_dimensions'), $('#select_prod_measures')]
};
// This is for updating fields the first time
fields.test.forEach(item => updateFields(tables.test_table, item));
fields.prod.forEach(item => updateFields(tables.prod_table, item));
function updateFields(table, field) {
var send = {
table: table.val()
};
field.attr('disabled', 'disabled');
field.empty();
$.getJSON("{{url_for('_get_fields') }}", send, function (data) {
data.forEach(function (item) {
field.append(
$('<option>', {
value: item[0],
text: item[1]
})
);
});
field.removeAttr('disabled');
});
}
// Test fields and prod fields are two arrays now, so I can simply iterate through them
tables.test_table.on('change', function () {
fields.test.forEach(item => updateFields(tables.test_table, item));
});
tables.prod_table.on('change', function () {
fields.prod.forEach(item => updateFields(tables.prod_table, item));
});
});