echarts axisModelCreator 源码

  • 2022-10-20
  • 浏览 (526)

echarts axisModelCreator 代码

文件路径:/src/coord/axisModelCreator.ts

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import axisDefault from './axisDefault';
import ComponentModel from '../model/Component';
import {
    getLayoutParams,
    mergeLayoutParam,
    fetchLayoutMode
} from '../util/layout';
import OrdinalMeta from '../data/OrdinalMeta';
import { DimensionName, BoxLayoutOptionMixin, OrdinalRawValue } from '../util/types';
import { AxisBaseOption, AXIS_TYPES, CategoryAxisBaseOption } from './axisCommonTypes';
import GlobalModel from '../model/Global';
import { each, merge } from 'zrender/src/core/util';
import { EChartsExtensionInstallRegisters } from '../extension';


type Constructor<T> = new (...args: any[]) => T;

export interface AxisModelExtendedInCreator {
    getCategories(rawData?: boolean): OrdinalRawValue[] | CategoryAxisBaseOption['data']
    getOrdinalMeta(): OrdinalMeta
}

/**
 * Generate sub axis model class
 * @param axisName 'x' 'y' 'radius' 'angle' 'parallel' ...
 */
export default function axisModelCreator<
    AxisOptionT extends AxisBaseOption,
    AxisModelCtor extends Constructor<ComponentModel<AxisOptionT>>
>(
    registers: EChartsExtensionInstallRegisters,
    axisName: DimensionName,
    BaseAxisModelClass: AxisModelCtor,
    extraDefaultOption?: AxisOptionT
) {

    each(AXIS_TYPES, function (v, axisType) {

        const defaultOption = merge(
            merge({}, axisDefault[axisType], true),
            extraDefaultOption, true
        );

        class AxisModel extends BaseAxisModelClass implements AxisModelExtendedInCreator {

            static type = axisName + 'Axis.' + axisType;
            type = axisName + 'Axis.' + axisType;

            static defaultOption = defaultOption;

            private __ordinalMeta: OrdinalMeta;


            mergeDefaultAndTheme(option: AxisOptionT, ecModel: GlobalModel): void {
                const layoutMode = fetchLayoutMode(this);
                const inputPositionParams = layoutMode
                    ? getLayoutParams(option as BoxLayoutOptionMixin) : {};

                const themeModel = ecModel.getTheme();
                merge(option, themeModel.get(axisType + 'Axis'));
                merge(option, this.getDefaultOption());

                option.type = getAxisType(option);

                if (layoutMode) {
                    mergeLayoutParam(option as BoxLayoutOptionMixin, inputPositionParams, layoutMode);
                }
            }

            optionUpdated(): void {
                const thisOption = this.option;
                if (thisOption.type === 'category') {
                    this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);
                }
            }

            /**
             * Should not be called before all of 'getInitailData' finished.
             * Because categories are collected during initializing data.
             */
            getCategories(rawData?: boolean): OrdinalRawValue[] | CategoryAxisBaseOption['data'] {
                const option = this.option;
                // FIXME
                // warning if called before all of 'getInitailData' finished.
                if (option.type === 'category') {
                    if (rawData) {
                        return (option as CategoryAxisBaseOption).data;
                    }
                    return this.__ordinalMeta.categories;
                }
            }

            getOrdinalMeta(): OrdinalMeta {
                return this.__ordinalMeta;
            }
        }

        registers.registerComponentModel(AxisModel);
    });

    registers.registerSubTypeDefaulter(
        axisName + 'Axis',
        getAxisType
    );
}

function getAxisType(option: AxisBaseOption) {
    // Default axis with data is category axis
    return option.type || ((option as CategoryAxisBaseOption).data ? 'category' : 'value');
}

相关信息

echarts 源码目录

相关文章

echarts Axis 源码

echarts AxisBaseModel 源码

echarts CoordinateSystem 源码

echarts View 源码

echarts axisAlignTicks 源码

echarts axisCommonTypes 源码

echarts axisDefault 源码

echarts axisHelper 源码

echarts axisModelCommonMixin 源码

echarts axisTickLabelBuilder 源码

0  赞