Проблема дублирования модели данных при боке (возможно, библиотека не подготовлена ​​к этому варианту использования)Javascript

Форум по Javascript
Ответить
Anonymous
 Проблема дублирования модели данных при боке (возможно, библиотека не подготовлена ​​к этому варианту использования)

Сообщение Anonymous »

Я хочу реализовать пошаговую логику для решения для построения многотаймфреймовых диаграмм с помощью библиотеки боке. Мне нужно экспортировать статический HTML-файл со всеми данными, поэтому размер экспорта HTML имеет значение.
В этом решении можно визуализировать несколько таймфреймов одновременно, графики разных таймфреймы рисуются друг на друге, НО только до заданного момента времени (назовем это триггер_дата).
time_tracker = ColumnDataSource(data=dict(trigger_date=[max_dt]))

Я использую ColumnDataSource для хранения данных для каждого таймфрейма, и мне нужно создать как минимум 2 кнопки (шаг назад и шаг вперед) для каждого таймфрейма.
Каждой кнопке мне нужно передать все данные, то есть каждый источник данных всех таймфреймов и каждый кадр данных всех таймфреймов для реализации пошаговой логики (чтобы показывать графики только до определенного момента времени и испускать() изменения правильно).
Важно: Количество таймфреймов (единиц агрегации) заранее неизвестно. Это определяется только входными данными. Невозможно указать в постоянном списке.
Например: 30с, 1м, 5м, 15м, 30м, 1ч, 4ч, 1д, ...
Это просто невозможно определить такую ​​вещь:
step_buttons[timeframe]['prev'].js_on_click(CustomJS(
args = dict(
time_tracker = time_tracker,
direction = -1,
min_dt = min_dt,
max_dt = max_dt,

# ALL TIMEFRAMES CAN NOT BE LISTED HERE BECAUSE IT'S UNKNOWN

datasource_5m = ...,
datasource_15m = ...,
datasource_30m = ...,
datasource_1h = ...,
datasource_4h = ...,
?????????????? = ...,
),
code = JS_CODE_STEP_LOGIC,
))

Поэтому я ДОЛЖЕН обернуть все возможные источники данных для каждого таймфрейма в более сложную структуру данных, которую можно передать кнопке в качестве одного аргумента:
p>
js_data[timeframe] = {
'data_source' : ColumnDataSource(dataframes[timeframe]),
'candle_data' : dataframes[timeframe].to_dict(orient="list"),
}

# or
# data_sources = {}
# candle_data = {}
# for timeframe in dataframes.keys():
# data_sources[timeframe] = ColumnDataSource(dataframes[timeframe])
# candle_data[timeframe] = dataframes[timeframe].to_dict(orient="list")

# ...

for tf in timeframes:

# I'VE A LOT OF THESE BUTTONS
# THE ARGUMENT LIST CAN NOT BE FIXED HERE
# I'VE TO PUT DATA SOURCES INTO A HIERARCHY WITH TIMEFRAME KEYS (candle_data_and_sources )
# AND IMPLEMENT A DYNAMIC LOGIC ON JS SIDE
# THE TIMEFRAMES ARE NOT KNOWN IN ADVANCE
# THIS IS WHAT DUPLICATES THE DATA
# AND INCREASES THE SIZE OF THE GENERATED HTML

step_buttons[tf]['prev'].js_on_click(CustomJS(
args = dict(
candle_data_and_sources = js_data, # need to use complex structure here
time_tracker = time_tracker,
direction = -1,
timeframe = tf,
min_dt = min_dt,
max_dt = max_dt,
),
code = JS_CODE_STEP_LOGIC,
))
step_buttons[tf]['next'] = ...

НО в этом случае модель, очевидно, будет дублироваться, что приведет к значительно большему размеру файла, чем требуется. Это приведет к проблемам с производительностью во время визуализации. Браузер не сможет открыть этот файл.
ВОПРОСЫ:
  • Как я могу передать все доступные данные только один раз каждой кнопке, не дублируя модель здесь?
  • Правильно ли я считаю, что жесткое кодирование всех возможных таймфреймов в аргументы кнопки не очень хорошо способ реализовать это (и в моем случае это может быть даже невозможно)..
Дополнительная информация 1:

Я пытался обойти эту проблему с помощью установил эту сложную структуру данных в качестве глобальной переменной на стороне JS, но я не смог найти рабочего решения.
Подробности см. здесь: Инициализировать глобальную переменную в боке и использовать ее в коде обработчика?
Дополнительная информация 2:

Используемая логика шагов аналогична следующей:
JS_CODE_STEP_LOGIC = """
const trigger_date = new Date(time_tracker.data['trigger_date'][0]);
let new_date = new Date(trigger_date);
new_date.setDate(new_date.getDate() + 1 * direction * get_tf_value(timeframe));
if (direction < 0){
new_date = new Date(Math.max(min_dt, new_date));
} else if (direction > 0){
new_date = new Date(Math.min(max_dt, new_date));
}
time_tracker.data['trigger_date'][0] = new_date.toISOString();

// I NEED TO DO THE FOLLOWING LOGIC FOR EACH TIMEFRAME
// THE NUMBER/VALUE OF TIMEFRAMES HERE ARE DYNAMIC
// THEREFORE THEY ARE ADDRESSING THE DATASOURCE IN THE HIERARCHY

for (const [timeframe, data] of Object.entries(candle_data_and_sources)) {

const filtererd_obejcts = {};
for (const [key, value] of Object.entries(data['candle_data'])) {
if(!filtererd_obejcts[key]){
filtererd_obejcts[key] = [];
}
}

for (let i = 0; i < data['candle_data'].trigger_dt.length; i++) {
if (new Date(data['candle_data'].trigger_dt)

Подробнее здесь: https://stackoverflow.com/questions/793 ... epared-for
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»