У меня есть компонент молнии, который включен на страницу VisualForce. При прямом доступе к странице с параметром URL-адреса «Id» это работает нормально (компонент загружается внутри страницы vf и отображает сведения о записи)

Мой следующий шаг — вызвать этот URL-адрес страницы vf из кнопки страницы vf, поэтому я создал пользовательскую кнопку и указал URL-адрес страницы vf. Теперь я хочу передать переменную с URL-адресом в LWC.

ПРОБЛЕМА; при вызове из действия URL он не устанавливает значение параметра «strInput».

currentPageReference = null; 
urlStateParameters = null;

/* Params from Url */
urlId = null;
urlLanguage = null;
urlType = null;

@wire(CurrentPageReference)
getStateParameters(currentPageReference) {
   if (currentPageReference) {
      this.urlStateParameters = currentPageReference.state;
      console.log('URL--->'+this.urlStateParameters);
      this.setParametersBasedOnUrl();
   }
}

setParametersBasedOnUrl() {
   this.urlId = this.urlStateParameters.id || null;
   this.urlLanguage = this.urlStateParameters.lang || null;
   this.urlType = this.urlStateParameters.type || 'true';
} 

Страница VF:

 <div style="text-align:center; height:20px;">
      <apex:form >
      <apex:commandButton id="ViewAll" value="LWC" onclick="CallLWC()"/>
      </apex:form>
      <script>
        function CallLWC(){            
        console.log('param is {!user.Id}')
        window.open("../apex/lwccalling?id={!User.Id}")
        }
      </script>
  </div>
0
Oleksandr Berehovskyi 6 Сен 2021 в 11:56
Я предполагаю, что lwccalling — это страница visualforce, на которую вы каким-то образом включаете LWC — можете ли вы поделиться этим фрагментом кода?
 – 
Alba Rivas
6 Сен 2021 в 13:12

1 ответ

Лучший ответ

Это не дает прямого ответа на вопрос, почему это работает так, а не иначе, но, возможно, решает проблему:

Используйте функцию javascript в LWC, чтобы получить параметры запроса из URL:

function getQueryParameters() {
var params = {};

var searchParams = [];

let search = location.search;
search = search.startsWith("?") ? search.substring(1) : search;

search.split("&").forEach(element => {
    if (element.startsWith("?q=") || element.startsWith("q=")) {
        let decompressedValue = decompressQueryParams(element.split("=")[1]);
        searchParams.push("q=" + decompressedValue);
    } else {
        searchParams.push(element);
    }
});

if (searchParams.length > 0) {
    search = searchParams.join("&");
}
if (search) {
    try {
        params = JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}', (key, value) => {
            return key === "" ? value : decodeURIComponent(value);
        });
    } catch (error) {
        return params;
    }
}

return params;
}

Чтобы в вашем LWC можно было сказать так:

/* Params from Url */
urlId;
urlLanguage;
urlType;
strInput;

connectedCallback(){
    let urlParams = this.getQueryParameters();
    this.urlId = urlParams['id'];
    this.urlLanguage = urlParams['lang'];
    this.urlType = urlParams['type'];
    this.strInput = urlParams['c__strInput']
}

getQueryParameters() {
    var params = {};

    var searchParams = [];

    let search = location.search;
    search = search.startsWith("?") ? search.substring(1) : search;

    search.split("&").forEach(element => {
        if (element.startsWith("?q=") || element.startsWith("q=")) {
            let decompressedValue = decompressQueryParams(element.split("=")[1]);
            searchParams.push("q=" + decompressedValue);
        } else {
            searchParams.push(element);
        }
    });

    if (searchParams.length > 0) {
        search = searchParams.join("&");
    }
    if (search) {
        try {
            params = JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}', (key, value) => {
                return key === "" ? value : decodeURIComponent(value);
            });
        } catch (error) {
            return params;
        }
    }

    return params;
}
0
Luisma Whatakuai 6 Сен 2021 в 16:23
Предположим, это URL-адрес XXXXXXX--c.visualforce.com/apex/LWCCall?c__strInput=true&id=0052K00000CBkb1QAD&inline=1. Я хочу эту переменную c__strInput=true в urlType.
 – 
SFDC Person
6 Сен 2021 в 15:39
Предложенный мной код возвращает объект, в котором ключи являются параметрами. Вы можете сделать так: this.getQueryParameters()['c__strInput']
 – 
Luisma Whatakuai
6 Сен 2021 в 16:00
В моем коде, где это будет соответствовать? что означает вызов getQueryParameters
 – 
SFDC Person
6 Сен 2021 в 16:04
Я отредактирую свой ответ и добавлю ваш исправленный контроллер LWC
 – 
Luisma Whatakuai
6 Сен 2021 в 16:15