Регистрация  |  Вход

LWC - Буферное хранение данных страницы

Раньше в Visualforce различные типы данных хранились в буфере контроллера.
Можно было в любой момент обратиться к любой мапе, листу и тд.

Сейчас же постоянного доступа к контроллеру нет и голова не варит как теперь быть.

Есть несколько этап обработки данных:
1) Загрузить файл. Файл в Apex конвертируется из CSV в Map. Возвращает Map в JS контроллер. Map итерируется на странице, показывает состав данных, отфильтрованный и отформатированный как таблица.

2) Смотрим на таблицу, если все устраивает, то нажимаем кнопку "Добавить прогресс в запись". Сейчас бы не помешало в буфере висеть этой Map, но так как обращаемся заново к Apex, эту Map нужно конвертировать из CSV (по старой ссылке на файл) в Map. Добавляется статистику вида (Россия=55, Украина=60) в 1 из полей записи.

3)Нажимаем отправить емейлы. По идее опять карта пригодится чтоб просто в метод апекса ее передать и выполнять пакет SingleEmailMessage. Но кажется опять нужно из того же CSV в Map форматировать.

Вопрос - где я загнался и как облегчить жизнь?

Раньше в Visualforce различные типы данных хранились в буфере контроллера.
Можно было в любой момент обратиться к любой мапе, листу и тд.

Сейчас же постоянного доступа к контроллеру нет и голова не варит как теперь быть.

Есть несколько этап обработки данных:
1) Загрузить файл. Файл в Apex конвертируется из CSV в [color=red]Map[/color]. Возвращает Map в JS контроллер. Map итерируется на странице, показывает состав данных, отфильтрованный и отформатированный как таблица.

2) Смотрим на таблицу, если все устраивает, то нажимаем кнопку "Добавить прогресс в запись". Сейчас бы не помешало в буфере висеть этой [color=red]Map[/color], но так как обращаемся заново к Apex, эту Map нужно конвертировать из CSV (по старой ссылке на файл) в Map. Добавляется статистику вида (Россия=55, Украина=60) в 1 из полей записи.

3)Нажимаем отправить емейлы. По идее опять [color=red]карта[/color] пригодится чтоб просто в метод апекса ее передать и выполнять пакет SingleEmailMessage. Но кажется опять нужно из того же CSV в Map форматировать.

Вопрос - где я загнался и как облегчить жизнь?

Ну можно заново парсить CSV
Можно отправить мапу из js controller в apex обратно


Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом

Ну можно заново парсить CSV
Можно отправить мапу из js controller в apex обратно


Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом

Maxim Elets
Ну можно заново парсить CSV
Можно отправить мапу из js controller в apex обратно


Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом

Привет, спасибо!

А как несколько объектов отправляешь из апекса, мапой? Например мапу и стринг нужно вернуть, делаешь мап<мап, стринг>?

[quote="Maxim Elets"]Ну можно заново парсить CSV
Можно отправить мапу из js controller в apex обратно


Я сильно не заморачиваюсь, потому что эти операции будут все равно работать в сотнитыщраз быстрее чем релоад страницы на VF с ее огромейшим вьюстейтом[/quote]

Привет, спасибо! 

А как несколько объектов отправляешь из апекса, мапой? Например мапу и стринг нужно вернуть, делаешь мап<мап, стринг>?

Я не знаю как делают другие, я то делаю public static Map<String, Object> get(){}
и возвращаю мапу на фронтед.

Можно делать врапперы, но мне лень:)

Я не знаю как делают другие, я то делаю public static Map<String, Object> get(){}
и возвращаю мапу на фронтед.

Можно делать врапперы, но мне лень:)

Ivan Sokolov
Раньше в Visualforce различные типы данных хранились в буфере контроллера.

Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода.

В твоем случае надо теперь ручками это делать в JS.

Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять.

На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных.

вот Apex наверное самые полезные команды:

Map<String, Object> map = new Map<String, Object>(); 
String str = JSON.serialize(map);
Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str);
WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class);

А в JS:

JSON.stringity(obj);
JSON.parse(str);

Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных.

Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).

[quote="Ivan Sokolov"]Раньше в Visualforce различные типы данных хранились в буфере контроллера.[/quote]
Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода. 

В твоем случае надо теперь ручками это делать в JS.

Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять.

На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных.

вот Apex наверное самые полезные команды:

[code]
Map<String, Object> map = new Map<String, Object>(); 
String str = JSON.serialize(map);
Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str);
WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class);
[/code]

А в JS:
[code]
JSON.stringity(obj);
JSON.parse(str);
[/code]

Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных.

Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).


Dmitry Shnyrev
Ivan Sokolov
Раньше в Visualforce различные типы данных хранились в буфере контроллера.

Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода.

В твоем случае надо теперь ручками это делать в JS.

Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять.

На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных.

вот Apex наверное самые полезные команды:

Map<String, Object> map = new Map<String, Object>(); 
String str = JSON.serialize(map);
Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str);
WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class);

А в JS:

JSON.stringity(obj);
JSON.parse(str);

Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных.

Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).


Дмитрий, спасибо!
Хорошо, что я не первый , вступивший в терру инкогнито))
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)

[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]Раньше в Visualforce различные типы данных хранились в буфере контроллера.[/quote]
Раньше ничего в буфере контроллера не хранилось. Все лежало во viewstate с его мизерным лимитом. И то что делалась переменная которая заполнялась в контрукторе VF контроллера, а потом была доступна из его методов это лишь вершина айсберга. На самом деле все эти public переменные складывались в тело html и отправлялись в браузер. А браузер когда вызывал метод в контроллере просто в хедере все эти переменные обратно отсылал где они распаковывались и делались доступными для метода. 

В твоем случае надо теперь ручками это делать в JS.

Правильно Маским написал, либо заново CSV парсить и добавлять/удалять данные в нем и возвращать на страницу обновленный вариант. Или со страницы полностью отправлять обновленный CSV в apex и его там сохранять.

На счет обмена данными между apex и JS. Настоятельно рекомендую обратить свой взор на JSON и не доверять SF сериализацию/десериализацию данных.

вот Apex наверное самые полезные команды:

[code]
Map<String, Object> map = new Map<String, Object>(); 
String str = JSON.serialize(map);
Map<String, Object> map = (Map<String, Object>)JSON.deserializeUntyped(str);
WrapperClass instance = (WrapperClass)JSON.deserialize(str, WrapperClass.class);
[/code]

А в JS:
[code]
JSON.stringity(obj);
JSON.parse(str);
[/code]

Комбинируя эти команды на стороне фронтенда и бэкенда можно обмениваться сколь угодно сложными структурами данных.

Помню первые года 4 моей практики я не слышал про них и никто в компании их не использовал - и это был просто мрак в кодинге. Когда я открыл эти команды и начал их использовать - больше никаких трудностей ни по одной задаче у меня не возникало в практике (причем на любом ЯП).[/quote]


Дмитрий, спасибо!
Хорошо, что я не первый , вступивший в терру инкогнито))
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)

Ivan Sokolov
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)

Не, я только могу указать путь, а пройти его придется самому

[quote="Ivan Sokolov"]А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)[/quote]
Не, я только могу указать путь, а пройти его придется самому :D :D :D 

Dmitry Shnyrev
Ivan Sokolov
А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)

Не, я только могу указать путь, а пройти его придется самому :D

Тоже дело хорошее.

Ну это совместно используется или каждая строка для разных целей?

[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]А можно пожалуйста под каждой строчкой расшифровку что конкретно делается там ?)[/quote]
Не, я только могу указать путь, а пройти его придется самому :D :D :D[/quote]

Тоже дело хорошее. 

Ну это совместно используется или каждая строка для разных целей?

Ivan Sokolov
Ну это совместно используется или каждая строка для разных целей?

Без обид, но у меня на этот вопрос только один ответ в голове созрел
Это строки двух разных молитв, которые надо произносить перед тем как садишься писать код и как заканчиваешь, чтобы не спугнуть дух бабла которое сыпется из ИТ просто за то что у тебя есть комп.

А если серьезно. Садимся и изучаем что такое ООП, классы, объект, что такое JSON и зачем он нужен, что такое сериализация и десериализация объектов, как данные перемещаются между сервером и клиентом.

[quote="Ivan Sokolov"]Ну это совместно используется или каждая строка для разных целей?[/quote]
Без обид, но у меня на этот вопрос только один ответ в голове созрел :D 
Это строки двух разных молитв, которые надо произносить перед тем как садишься писать код и как заканчиваешь, чтобы не спугнуть дух бабла которое сыпется из ИТ просто за то что у тебя есть комп.

А если серьезно. Садимся и изучаем что такое ООП, классы, объект, что такое JSON и зачем он нужен, что такое сериализация и десериализация объектов, как данные перемещаются между сервером и клиентом.

А, извини! Возможно для LWC все это не нужно и я только запутываю. Я просто с LWC не работаю вообще
Но так для общего развития может пригодится

А, извини! Возможно для LWC все это не нужно и я только запутываю. Я просто с LWC не работаю вообще :D 
Но так для общего развития может пригодится :) 

APEX:

Map<String, List<Map<String,String>>> returnedMap = new  Map<String, List<Map<String,String>>>();
returnedMap.put(newValue, reportData.values());
return JSON.serialize(returnedMap);

LWC JS:

.then(result => {

var mapFromApex = JSON.parse(result);
// Если вывести в лог будет то, что отправлено с апекса, в верном формате -
// {
// "Russian Federation,0\n" - String
// :
// [{"fullname":"Employee FN","Manager Email":"n@lil.com","Country":"Russian Federation","Device Model":"iPhone 18","OS Version":"15","Email":"n@lil.com"}] - List<Map<String,String>>
// }

var mapsList;

for (var key in mapFromApex) {
this.progressStatus = key; - ЗДЕСЬ НОРМАЛЬНО ПРИСВАЕВАЕТСЯ
alert('value = ' + JSON.stringify(mapFromApex[key]));
mapsList = mapFromApex[key];
}

for (var mapItem in mapsList) {
alert('mapItem = ' + JSON.stringify(mapItem)); - здесь выводит номер строки по порядку, хотя никаких таких значений там не содержится.
}

Вопрос - как обработать Value возвращенной из Apex карты, чтобы сделать итерации по строкам CSV и по заголовку-значению (Map <String, String>) в HTML?

Спасибо!

[b]APEX:[/b]
[code]
Map<String, List<Map<String,String>>> returnedMap = new  Map<String, List<Map<String,String>>>();
returnedMap.put(newValue, reportData.values());
return JSON.serialize(returnedMap);
[/code]

[b]LWC JS:[/b]
[code]
.then(result => {

                var mapFromApex = JSON.parse(result); 
// Если вывести в лог будет то, что отправлено с апекса, в верном формате - 
// {
// "Russian Federation,0\n" - String
// :
// [{"fullname":"Employee FN","Manager Email":"n@lil.com","Country":"Russian Federation","Device Model":"iPhone 18","OS Version":"15","Email":"n@lil.com"}] - List<Map<String,String>>
// }

                var mapsList;

                for (var key in mapFromApex) {
                    this.progressStatus = key; - ЗДЕСЬ НОРМАЛЬНО ПРИСВАЕВАЕТСЯ 
                    alert('value = ' + JSON.stringify(mapFromApex[key]));
                    mapsList = mapFromApex[key];
                }

                for (var mapItem in mapsList) {
                    alert('mapItem =  ' + JSON.stringify(mapItem)); - здесь выводит номер строки по порядку, хотя никаких таких значений там не содержится. 
                }
[/code]

[b]Вопрос[/b] - как обработать [b]Value[/b] возвращенной из Apex карты, чтобы сделать итерации по строкам CSV и по заголовку-значению (Map <String, String>) в HTML?

Спасибо!

Окей. Ошибка была в последнем цикле.
Лист итерируется циклом for:

for (var i = 0; i < mapsList.length; i++) {
for (var key in mapsList[i]) {
alert('key in ' + i + ' map = ' + key);
}
}

Окей. Ошибка была в последнем цикле.
Лист итерируется циклом for:
[code]
                for (var i = 0; i < mapsList.length; i++) {
                    for (var key in mapsList[i]) {
                        alert('key in ' + i + ' map = ' + key);
                    }
                }[/code]

Для перебора массива(list|array) в JS надо использовать:
for (var mapItem of mapsList)

Супер! Вижу прогресс в JSON сериализации/десериализации! Все правильно сделал

Только когда дебажешь в браузере не надо использовать alert!

используй console.log и без "+ JSON.stringify" - так намного удобнее и правильнее

Для перебора массива(list|array) в JS надо использовать:
for (var mapItem [color=red][b]of[/b][/color] mapsList) 

Супер! Вижу прогресс в JSON сериализации/десериализации! Все правильно сделал

Только когда дебажешь в браузере не надо использовать alert!

используй console.log и без "+ JSON.stringify" - так намного удобнее и правильнее

Dmitry Shnyrev
for (var mapItem of mapsList)

Спасибо, и правда "of"

А как же без stringify?

объект так не получается вывести:

console.log('mapItem = ' + mapItem);

даёт результат - mapItem = [object Object]

[quote="Dmitry Shnyrev"]for (var mapItem of mapsList)[/quote]

Спасибо, и правда "[b]of[/b]"

А как же без stringify?

объект так не получается вывести:
[code]console.log('mapItem = ' + mapItem);[/code]
даёт результат  -  mapItem = [object Object]

console.log('mapItem =', mapItem);
Не надо складывать! Все что надо вывести, через запятую.
или просто
console.log(mapItem);

console.log('mapItem ='[color=red],[/color] mapItem);
Не надо складывать! Все что надо вывести, через запятую. 
или просто
console.log(mapItem);

Dmitry Shnyrev
console.log('mapItem =', mapItem);
Не надо складывать! Все что надо вывести, через запятую.
или просто
console.log(mapItem);

Спасибо, чудеса! Вот так денек!

Входные данные: файл CSV - Fullname, Email, Country, Device, Version, Manager Email

Выходные данные после обработки файла:
Map<Integer, Map<String,String>> reportData, где Integer = номер по порядку / ключ. Map<String, String> - Заголовок=Значение.

Всё помещается в returnedMap, чтобы вернуть из Apex reportData и дополнительно текстовую строку stringRow:

Map<String, Map<Integer, Map<String,String>>> returnedMap = new   Map<String, Map<Integer, Map<String,String>>>();
returnedMap.put(stringRow, reportData);
return JSON.serialize(returnedMap);

Обрабатываем в JS полученную строку:

.then(result => {

var mapFromApex = JSON.parse(result);
var mapsMap;

for (var key in mapFromApex) {
this.progressStatus = key;
mapsMap = mapFromApex[key];
}

for (var integerIndex in mapsMap) {
console.log('iterate map # ', integerIndex, ' = ', mapsMap[integerIndex]);
var tempMap = [];
for (var header in mapsMap[integerIndex]) {
console.log('Header = ', header, '. Value = ', mapsMap[integerIndex][header]);
tempMap.push({
key: header,
value: mapsMap[integerIndex][header]
})
}
console.log(' got temp map = ', tempMap);

this.mapData.push({
key: integerIndex,
value: tempMap,
});
console.log(' got new map = ', this.mapData);

this.isUploaded = true;
}
})

HTML:

<table class="slds-table slds-table_bordered slds-table_cell-buffer slds-table_col-bordered slds-table_striped">
<template for:each={mapData} for:item="row">
<tr key={row.key}>
<template for:each={row.value} for:item="headline">
<td key={headline.key}>{headline.value}</td>
</template>
</tr>
</template>
</table>

А еще вопрос. Есть ли способ вывести карты в HTML без создания доп. карты с key/value?

[quote="Dmitry Shnyrev"]console.log('mapItem ='[color=red],[/color] mapItem);
Не надо складывать! Все что надо вывести, через запятую. 
или просто
console.log(mapItem);[/quote]

Спасибо, чудеса! Вот так денек!

Входные данные: файл CSV - Fullname, Email, Country, Device, Version, Manager Email

Выходные данные после обработки файла:
Map<Integer, Map<String,String>> [b][color=red]reportData[/color][/b], где Integer = номер по порядку / ключ. Map<String, String> - Заголовок=Значение.

Всё помещается в returnedMap, чтобы вернуть из Apex [color=red]reportData[/color] и дополнительно текстовую строку [color=green]stringRow[/color]:
[code]
Map<String, Map<Integer, Map<String,String>>> [color=purple]returnedMap[/color] = new   Map<String, Map<Integer, Map<String,String>>>();
returnedMap.put([color=green]stringRow[/color], [color=red]reportData[/color]);
return JSON.serialize([color=purple]returnedMap[/color]);
[/code]

Обрабатываем в JS полученную строку:
[code]
.then(result => {

                var mapFromApex = JSON.parse(result);
                var mapsMap;

                for (var key in mapFromApex) {
                    [color=green]this.progressStatus = key[/color];
                    [color=red]mapsMap = mapFromApex[key];[/color]
                }

                for (var integerIndex in mapsMap) {
                    console.log('iterate map # ', integerIndex, ' = ', mapsMap[integerIndex]);
                    var tempMap = [];
                    for (var header in mapsMap[integerIndex]) {
                        console.log('Header =  ', header, '. Value = ', mapsMap[integerIndex][header]);
                        tempMap.push({
                            key: header,
                            value: mapsMap[integerIndex][header]
                        })
                    }
                    console.log(' got temp map = ', tempMap);

                    this.mapData.push({
                        key: integerIndex,
                        value: tempMap,
                    });
                    console.log(' got new map = ', this.mapData);

                    this.isUploaded = true;
                }
            })
[/code]

HTML:

[code]
 <table class="slds-table slds-table_bordered slds-table_cell-buffer slds-table_col-bordered slds-table_striped">
                        <template for:each={mapData} for:item="row">
                            <tr key={row.key}>
                                <template for:each={row.value} for:item="headline">
                                    <td key={headline.key}>{headline.value}</td>
                                </template>
                            </tr>
                        </template>
</table>
[/code]

А еще вопрос. Есть ли способ вывести карты в HTML без создания доп. карты с key/value?

Что-то с обработкой ты сильно намудрил.

Можешь простыми словами описать что у тебя в .then находится?

Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных.

Сейчас код реально как полный бред выглядит.

Я думаю если начнешь описывать каждую строчку понимание что написал придет само собой.

Вообще передать из Apex карту и вывести ее на в HTML это всего одна строка в .then(result => {...} и та простое присваивание.

(но лучше не переводить это слово как карта - в простонародье это "мапа" (Map) точно также как List это "лист")

Что-то с обработкой ты сильно намудрил. 

Можешь простыми словами описать что у тебя в .then находится?

Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных.

Сейчас код реально как полный бред выглядит.

Я думаю если начнешь описывать каждую строчку понимание что написал придет само собой. 

Вообще передать из Apex карту и вывести ее на в HTML это всего одна строка в .then(result => {...} и та простое присваивание.

(но лучше не переводить это слово как карта - в простонародье это "мапа" (Map) точно также как List это "лист")


Вообще если рассуждать правильным язуком, то CSV это массив(List) состоящий из линий(Rows). А линии это объекты в котором каждое значение это атрибут. Таким образом CSV = List of objects. Как бы тут картой(мапой) и не пахнет. Конечно если рассуждать дальше то отдельный объект с атрибутами это та же мапа с ключем и значением, но такое понимание больше собьет начинающего с понимания :).

Вообще если рассуждать правильным язуком, то CSV это массив(List) состоящий из линий(Rows). А линии это объекты в котором каждое значение это атрибут. Таким образом CSV = List of objects. Как бы тут картой(мапой) и не пахнет. Конечно если рассуждать дальше то отдельный объект с атрибутами это та же мапа с ключем и значением, но такое понимание больше собьет начинающего с понимания :).

Dmitry Shnyrev
Что-то с обработкой ты сильно намудрил.

Можешь простыми словами описать что у тебя в .then находится?

Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных.

Сначала получил результат и поместил его в mapFromApex.

Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).

Потом чтобы вывести на страницу, используя LWC атрибуты for:each/ for:item мне нужны значения key/value.
Если можно вывести по-другому - скажите пожалуйста как. Но это вроде как единственный способ в LWC:
https://newstechnologystuff.com/2019/04/07/iterate-map-in-lightning-web-components-lwc/

[quote="Dmitry Shnyrev"]Что-то с обработкой ты сильно намудрил. 

Можешь простыми словами описать что у тебя в .then находится?

Построчно. Обычными русскими словами. Беру то-то делаю тот. Для "беру то-то" пример данных.
[/quote]

Сначала получил результат и поместил его в mapFromApex.

Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap  = Map<Integer, Map<String,String>>).

Потом чтобы вывести на страницу, используя LWC атрибуты for:each/ for:item мне нужны значения key/value.
Если можно вывести по-другому - скажите пожалуйста как. Но это вроде как единственный способ в LWC:
https://newstechnologystuff.com/2019/04/07/iterate-map-in-lightning-web-components-lwc/

Ivan Sokolov
Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).

Ты понимаешь что вот в этом проблема?

У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?

[quote="Ivan Sokolov"]Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).[/quote]
Ты понимаешь что вот в этом проблема?

У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?

Возьми в коде JS. После каждой строки кода добавь console.log и выведи переменные которые ты в этой строке использовал. И посмотри что будет в консоли творится. Что в каждой переменной на каждом шаге у тебя получится.

Ivan Sokolov
Если можно вывести по-другому - скажите пожалуйста как.

Я не могу сказать "как" сделать. Я могу только сказать правильно или нет!

Возьми в коде JS. После каждой строки кода добавь console.log и выведи переменные которые ты в этой строке использовал. И посмотри что будет в консоли творится. Что в каждой переменной на каждом шаге у тебя получится.

[quote="Ivan Sokolov"]Если можно вывести по-другому - скажите пожалуйста как. [/quote]
Я не могу сказать "как" сделать. Я могу только сказать правильно или нет!

Dmitry Shnyrev
Ivan Sokolov
Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).

Ты понимаешь что вот в этом проблема?

У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?

Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>

Тут будет 1 кружка всего и 1 цикл.
Просто вытащил 2 разных объекта из апекса одним return.

[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]Потом циклом for к локальной текстовой переменной присвоил значение ключа из mapFromApex.
А на mapsMap присвоил value мапы из апекса (mapsMap = Map<Integer, Map<String,String>>).[/quote]
Ты понимаешь что вот в этом проблема?

У тебя есть одна кружка (переменная) и тебе надо сделать 10 кружек чая. Ты берешь эту кружку делаешь один чай, потом берешь опять эту же полную кружку и опять делаешь в ней чай. Что получашь когда сделаешь 10 кружек чая?[/quote]

Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>

Тут будет 1 кружка всего и 1 цикл.
Просто вытащил 2 разных объекта из апекса одним return.

Ivan Sokolov
Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>

А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for?

Почему не сделать <номер строки CSV, мапа<заголовок=значение>>
просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...

[quote="Ivan Sokolov"]Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>[/quote]

А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for?

Почему не сделать <номер строки CSV, мапа<заголовок=значение>>
просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...

Так для сведения на будущее.

Map это не сортированная структура. и если ты туда положишь что-то с ключами 0,1,2,3 ...
и потом сделаешь for in Map, то не факт что у тебя ключи будут в том же порядке. Можешь получить 3,1,0,2.

Потом ключи придется еще сортировать.

Конечно в большенстве случаев в результате ты увидишь ключи в правильном порядке, но считай что тебе просто повезло!

Так для сведения на будущее. 

Map это не сортированная структура. и если ты туда положишь что-то с ключами 0,1,2,3 ...
и потом сделаешь for in Map, то не факт что у тебя ключи будут в том же порядке. Можешь получить 3,1,0,2.

Потом ключи придется еще сортировать. 

Конечно в большенстве случаев в результате ты увидишь ключи в правильном порядке, но считай что тебе просто повезло!

Dmitry Shnyrev
Ivan Sokolov
Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>

А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for?

Почему не сделать <номер строки CSV, мапа<заголовок=значение>>
просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...

Хороший вопрос. Подумаю, почему я так сделал..

[quote="Dmitry Shnyrev"][quote="Ivan Sokolov"]Там всего получится ключ и значение.
Ключ - текстовая
Значение - мапа<номер строки CSV, мапа<заголовок=значение>>[/quote]

А почему тогда просто не достать значение по ключу, а не перебирать все ключи в for?

Почему не сделать <номер строки CSV, мапа<заголовок=значение>>
просто [мапа<заголовок=значение>] ([] это List) в List и так ключи это 0, 1, 2 ...[/quote]

Хороший вопрос. Подумаю, почему я так сделал..