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

Закрыть subtab из lighthning component внутри visualforce страницы.

Всем привет,
Не знаю насколько корректный ли вопрос, тем более прочитав несколько предидущих постов о заданиях новичков, как то аж немного неловко спрашивать, но все же.
Пока ничего так и не смог найти по этой теме.

Делаю страницу в классике в service console. Когда с кейса нажимается кнопка то в сабтабе открывается visualfrorce страница и внутри нее запихан lighthning component, так сделано, чтоб в будущем удобнее было переходить на lighthning service console. Должна быть кнопка cancel в компоненте , которая закроет этот subtab и вернется обратно в главные таб с кейсом.
Нашел как сделать это, если просто visualforce страница и нашел как сделать это в лайтнинговой консоли, но как это сделать из лайтнинг компонента в классике не нашел.

Сталкивался кто нибудь с таким или есть какие нибудь идеи?
Заранее спасибо за помощь!

Всем привет, 
Не знаю насколько корректный ли вопрос, тем более прочитав несколько предидущих постов о заданиях новичков, как то аж немного неловко спрашивать, но все же. 
Пока ничего так и не смог найти по этой теме.
 
Делаю страницу в классике в service console. Когда с кейса нажимается кнопка то в сабтабе открывается visualfrorce страница и внутри нее запихан lighthning component, так сделано, чтоб в будущем удобнее было переходить на lighthning service console. Должна быть кнопка cancel в компоненте , которая закроет этот subtab и вернется обратно в главные таб с кейсом. 
Нашел как сделать это, если просто visualforce страница и нашел как сделать это в лайтнинговой консоли, но как это сделать из лайтнинг компонента в классике не нашел.

Сталкивался кто нибудь с таким или есть какие нибудь идеи? 
Заранее спасибо за помощь!

Не работал с Service Console, но если мне память не изменяет там команды специфические для консоли через JS мутятся.
Давай будем вместе разбираться.

AntonB
Нашел как сделать это, если просто visualforce страница

Напиши сюда что за метод.

Одно из предположений - оставить этот рабочий метод в VF странице, но попробовать сделать так чтобы Lighting компонент его вызывал. Получится небольшая цепочка

Lightning -> VF -> Service Console

Не работал с Service Console, но если мне память не изменяет там команды специфические для консоли через JS мутятся.
Давай будем вместе разбираться.
[quote="AntonB"]Нашел как сделать это, если просто visualforce страница[/quote]
Напиши сюда что за метод.

Одно из предположений - оставить этот рабочий метод в VF странице, но попробовать сделать так чтобы Lighting компонент его вызывал. Получится небольшая цепочка

Lightning -> VF -> Service Console 

AntonB
Не знаю насколько корректный ли вопрос, тем более прочитав несколько предидущих постов о заданиях новичков, как то аж немного неловко спрашивать, но все же.

Те посты касались задания для новичков. Не думаю что твой вопрос можно отнести к этому разряду

[quote="AntonB"]Не знаю насколько корректный ли вопрос, тем более прочитав несколько предидущих постов о заданиях новичков, как то аж немного неловко спрашивать, но все же. [/quote]
:D Те посты касались задания для новичков. Не думаю что твой вопрос можно отнести к этому разряду :D 

Dmitry Shnyrev
Напиши сюда что за метод

В документации это находил:
https://developer.salesforce.com/docs/atlas.en-us.api_console.meta/api_console/sforce_api_console_closetab.htm

Dmitry Shnyrev
Одно из предположений - оставить этот рабочий метод в VF странице, но попробовать сделать так чтобы Lighting компонент его вызывал.

Да, я думал может всю кнопку, которая закрывает сабтаб оставить на странице, но не знаю, насколько красиво это будет смотреться потом и насколько удобно использовать будет.

Вот думаю, если просто js скрипт оставить на странице и вызывать если с lighthning компонента после нажатия, то наверное будет лучше. Но, на самом деле, не знаю даже можно ли вызывать функцию на странице из компонента, оно работает так в обратном порядке?

[quote="Dmitry Shnyrev"]
Напиши сюда что за метод
[/quote]

В документации это находил: 
https://developer.salesforce.com/docs/atlas.en-us.api_console.meta/api_console/sforce_api_console_closetab.htm 

[quote="Dmitry Shnyrev"]
Одно из предположений - оставить этот рабочий метод в VF странице, но попробовать сделать так чтобы Lighting компонент его вызывал.
[/quote]

Да, я думал может всю кнопку, которая закрывает сабтаб оставить на странице, но не знаю, насколько красиво это будет смотреться потом и насколько удобно использовать будет.

Вот думаю, если просто js скрипт оставить на странице и вызывать если с lighthning компонента после нажатия, то наверное будет лучше. Но, на самом деле, не знаю даже можно ли вызывать функцию на странице из компонента, оно работает так в обратном порядке? 

А, ну все.

оставляешь на VF странице

window.closeSubtab = function closeSubtab(tabId) {
sforce.console.closeTab(tabId);
};

А в Lightning ищешь способ как вызвать JS функцию из внешней страницы.

К примеру:
Если Lightning компонент не внутри iframe, то просто вызываешь
window.closeSubtab(<MyTabId>);

Если внутри iframe смотри как между iframes можно JS функции вызывать.

А, ну все.

оставляешь на VF странице 

[code]
window.closeSubtab = function closeSubtab(tabId) {
   sforce.console.closeTab(tabId);
};
[/code]

А в Lightning ищешь способ как вызвать JS функцию из внешней страницы.

К примеру:
Если Lightning компонент не внутри iframe, то просто вызываешь 
window.closeSubtab(<MyTabId>);

Если внутри iframe смотри как между iframes можно JS функции вызывать.

А кстати, чет сейчас и вопрос возник

Если Lightning не внутри iframe, то по идее он должен иметь доступ к sforce.console

А кстати, чет сейчас и вопрос возник

Если Lightning не внутри iframe, то по идее он должен иметь доступ к sforce.console

Dmitry Shnyrev
Если Lightning не внутри iframe, то по идее он должен иметь доступ к sforce.console

Ну у меня компонент со страницы вот так вот вызывается:
<apex:page controller="" id="">
<apex:includeLightning />
<div id="lightning"></div>
<script>
$Lightning.use("c:lighthningApp", function() {
$Lightning.createComponent("c:LighthningComponent",
{ "id": "{!id}"},
"lightning");
});
</script>
</apex:page>


Думаю, можно попробовать в iframe это все запихнуть и посмотрю тогда будет ли работать.
Спасибо

[quote="Dmitry Shnyrev"]Если Lightning не внутри iframe, то по идее он должен иметь доступ к sforce.console[/quote]

Ну у меня компонент со страницы вот так вот вызывается:
  <apex:page controller="" id="">
    <apex:includeLightning />
    <div id="lightning"></div>
    <script>
         $Lightning.use("c:lighthningApp", function() {
          $Lightning.createComponent("c:LighthningComponent",
          { "id": "{!id}"},
          "lightning");
        });
    </script>
 </apex:page>


Думаю, можно попробовать в iframe это все запихнуть и посмотрю тогда будет ли работать.
Спасибо

Не надо ничего запихивать.
Тут вся суть в том в iframe/не iframe.
НЕ iframe лучше.

Так а внутри Lightning если сделать sforce.console.closeTab();
оно не работает?

Метод если вызывать вот так
window.closeSubtab(<MyTabId>);

?

Ошибки какие?

Не надо ничего запихивать. 
Тут вся суть в том в iframe/не iframe.
НЕ iframe лучше.

Так а внутри Lightning если сделать sforce.console.closeTab();
оно не работает? 

Метод если вызывать вот так
window.closeSubtab(<MyTabId>); 

?

Ошибки какие?

Ну если из компонента я вызываю sforce.console.closeTab() то оно ругается, что не знает, что такое sforce.console, его надо как то импортить туда? Тоже самое с window.closeSubtab, говорит, что не знает такого, даже когда на странице есть функция window.closeSubTab = function closeTab(){}

Ну если из компонента я вызываю sforce.console.closeTab() то оно ругается, что не знает, что такое sforce.console, его надо как то импортить туда? Тоже самое с window.closeSubtab, говорит, что не знает такого, даже когда на странице есть функция window.closeSubTab = function closeTab(){}

Вот! Значит у тебя iframe!
Посмотри в Element Inspector (Dev Console браузера) где у тебя Lightning component сидит. Есть ли выше тег(и) iframe.
Мне кажется что ты его найдешь.

Попробуй из lighting component не window.closeSubtab() вызвать
parent.closeSubtab()
или
top.closeSubtab()

Конечно есть у меня еще одно подозрение!
Не помню деталей, но где-то упоминалось, что Salesforce замутил такую штуку чтобы Lightning Components выполнялись в своебразной песочнице (Но это пока далекие догадки)

Пока проверь с iframe

Вот! Значит у тебя iframe!
Посмотри в Element Inspector (Dev Console браузера) где у тебя Lightning component сидит. Есть ли выше тег(и) iframe.
Мне кажется что ты его найдешь. 

Попробуй из lighting component не window.closeSubtab() вызвать 
parent.closeSubtab()
или
top.closeSubtab()

Конечно есть у меня еще одно подозрение!
Не помню деталей, но где-то упоминалось, что Salesforce замутил такую штуку чтобы Lightning Components выполнялись в своебразной песочнице (Но это пока далекие догадки)

Пока проверь с iframe
Как вариант попробуй что из этого
https://developer.salesforce.com/blogs/developer-relations/2017/01/lightning-visualforce-communication.html

Дмитрий, спасибо!! Все заработало!

Это я перепутал, sforce.console работает все таки в котролере компонента. Но он например не может найти tabId, по этому я нахожу tabId на странице и потом, когда создаю компонент то просто передаю этот id как параметр и внутри компонента уже могу вызывать sforce.console.closeTab(tabId).

Спасибо за помощь!

Дмитрий, спасибо!! Все заработало!

Это я перепутал, sforce.console работает все таки в котролере компонента. Но он например не может найти tabId, по этому я нахожу tabId на странице и потом, когда создаю компонент то просто передаю этот id как параметр и внутри компонента уже могу вызывать sforce.console.closeTab(tabId). 

Спасибо за помощь!