Flask + Echarts 前端代码 如何进行拆分

Flask + Echarts 前端代码 如何进行拆分

1. 遇到的问题

写Echarts前端代码太长了,为什么css和js代码都要放在html文件里,怎么拆开来?

2. 直接拆行吗

先直接把js独立出来

/static/js/myEcharts.js

let height = '600px'
let width = '945px'

let divEles = document.getElementsByTagName('div')
for (let i = 0; i < divEles.length; i++) {
    divEles[i].style.height = height
    divEles[i].style.width = width
}

let myEcharts1 = echarts.init(document.getElementById('div1'))
let myEcharts2 = echarts.init(document.getElementById('div2'))

// jinja2
echartsData = {{ data | safe }}

这还用说?直接报错

jinja2等后端模板引擎只能在html中用,js是不认识的。(除非使用一些前端渲染模板)

3. 思考一下

为什么要使用jinja2模板?

向前端传数据

前端不能自己拿数据吗?

可以,用js向后端发起一个请求就行

4. 用jq发起一个Ajax请求

4.1 定义接口

在发请求前先定义一个接口

@charts.route('/echartsData')
def get_echarts_data():
    option1 = get_option1()
    option5_guangdong, option5_jiangsu, option5_shandong = get_option5()
    option9_x, option9_d = get_option9()
    option11_d1, option11_d2 = get_option11()

    echarts_data = {
        'option1': option1,
        'option5_guangdong': option5_guangdong,
        'option5_jiangsu': option5_jiangsu,
        'option5_shandong': option5_shandong,
        'option9_x': option9_x,
        'option9_d': option9_d,
        'option11_d1': option11_d1,
        'option11_d2': option11_d2
    }

    return echarts_data

4.2 get请求

$.get('/echartsData', function (data) {
        let echartsData = data;
});

可是这样请求并不会发送,因为没有调用。

可以使用$(document).ready(function()等待doc加载完毕后自动调用

$(document).ready(function () {
    $.get('/echartsData', function (data) {
        let echartsData = data;
    })
})

但是这样的话,因为是异步请求,变量echartsData是不能在全局中使用的,之后的所有用到echartsData的代码都要卸载这个函数中

$(document).ready(function () {
    $.get('/echartsData', function (data) {
        let echartsData = data;
        
        option1 = {
			......
        };
        
        option2 = {
            ......
        };
        
        myEcharts1.setOption(option1);
        myEcharts2.setOption(option2);
    });
});

4.3 禁止异步

感觉函数太长了,难看,怎么禁止异步呢?

其实上面Ajax请求的代码是简写模式,完整的Ajax请求应该是这样写的:

let echartsData;

$.ajax({
    url: '/echartsData',
    async: false,
    success: function (data) {
        echartsData = data
    }
});

关于参数async,官网的解释是这样的:

async (default: true)

Type: Boolean

By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false.

意思默认值是true发起异步请求,设置为false禁止异步。

这样一来,就可以禁止异步请求,把数据赋值给全局变量了,拆分工作完成!


参考

原文地址:https://www.cnblogs.com/pineapple-py/p/14613484.html