Cerca de 20 min
- Objetivos de aprendizagem
- Gerenciando a navegação
- Navegação no Lightning Experience
- Navegação clássica do Visualforce
- Navegação do Visualforce moderno
- Importante
- Armadilhas de navegação e como corrigi-las
- Não configurar window.location diretamente
- A questão do Salesforce Classic
- URLs estáticos
- Recursos
- Desafio +100 pontos
Procurando ajuda?
Gerenciar a navegação
Objetivos de aprendizagem
- Descrever os três mecanismos “clássicos” do Visualforce para controle de navegação de uma página para outra.
- Descrever quais dessas técnicas não funcionam no Lightning Experience.
- Listar pelo menos três eventos de navegação do Lightning Experience e saber como enviá-los.
Gerenciando a navegação
A boa notícia é que a navegação “clássica” do Visualforce continua funcionando. A melhor notícia é que as páginas do seu Visualforce também podem se beneficiar dos novos mecanismos do Lightning Experience.
Navegação no Lightning Experience
O primeiro significado de navegação pode ser elemento da interface de usuário na tela. Você clica em algo e algo acontece. Por exemplo, você clica no item Contas no menu de navegação e vai para a página inicial do objeto Contas. Você clica no botão Novo e uma entrada de registro é exibida. Você escolhe uma ação personalizada de um menu de ações rápidas e inicia um processo personalizado. E assim por diante. Esses botões e itens de menu são elementos de navegação.
O design do sistema de navegação, a interface de usuário no Lightning, é bem diferente do Salesforce Classic. Não vamos falar aqui sobre essas diferenças, mas é bom se familiarizar com as mudanças de posicionamento das coisas ao alternar as duas experiências de usuário. Você pode saber mais sobre isso aqui no Trailhead, na unidade Navegando pelo Lightning Experience e pelas configurações.
Outro tipo de navegação menos visível é a parte do “algo acontece”. Nos bastidores, o Salesforce decide o que vai acontecer quando você seleciona um item em um menu ou clica em um link ou botão. Grande parte dessa navegação já está incorporada ao Salesforce, enquanto outros aspectos são personalizáveis, por exemplo, substituir ações com páginas do Visualforce. Mas toda essa navegação é gerenciada por código escrito pelo Salesforce.
E existe a navegação em seus próprios aplicativos, que usam seu código para controlar o fluxo de aplicativo. Quando a sua ação personalizada abre um formulário e o usuário clica em salvar, para onde você vai? Quando seu código em execução toma uma decisão sobre onde o usuário deve ir e o envia para lá. É sobre isso que vamos falar nesta unidade.
Navegação clássica do Visualforce
Lembre-se também de que o Controlador padrão retorna um PageReference de seus métodos de ação. Por isso, sua navegação atual, não importa se você está usando o Controlador padrão ou seu próprio código controlador personalizado, continua funcionando como previsto.
Navegação do Visualforce moderno
O JavaScript é o futuro, e o futuro começa agora. Vários desenvolvedores do Visualforce usam muito o JavaScript em seus aplicativos, e esse uso só aumenta. O Visualforce clássico funciona, e continuará a funcionar por muito tempo. Porém, conforme os desenvolvedores adotam recursos do Visualforce como Objetos remotos e JavaScript Remoting, uma parte maior do comportamento dos aplicativos migra do servidor, em que PageReference é a regra, para o navegador e JavaScript, onde PageReference não existe.
No mundo do Lightning Experience (e do aplicativo Salesforce), há regras e ferramentas para criar a navegação em JavaScript. Daqui a pouco falaremos das regras, que abordam principalmente o que não fazer. Antes de tudo, vamos falar sobre como fazer as coisas do jeito certo.
O Lightning Experience gerencia a navegação usando eventos. A estrutura de evento de navegação é disponibilizada como um objeto de utilidade do JavaScript que oferece diversas funções para simplificar a criação da navegação programática. O objeto sforce.one é automaticamente adicionado às páginas do Visualforce quando elas são executadas no Lightning Experience. Esse objeto oferece diversas funções que acionam eventos de navegação em que as funções são chamadas. Para usar essas funções, você pode chamá-las diretamente do código JavaScript da sua página ou anexar as chamadas como manipuladores de clique (ou de outros itens) nos elementos da página.
Importante
O objeto sforce.one não está disponível no Salesforce Classic. Qualquer código que o use deve ser testado para verificar a existência de sforce.one primeiro.
Função | Descrição |
---|---|
back([refresh ]) | Navega até o estado anterior salvo no histórico do sforce.one. É equivalente a clicar no botão Voltar do navegador. |
navigateToSObject(recordId [, view ]) | Navega para um registro sObject especificado por recordId. |
navigateToURL(url [, isredirect ]) | Navega até o URL especificado. |
navigateToFeed(subjectId, type ) | Navega para o feed de type especificado, no escopo de subjectId. |
navigateToFeedItemDetail(feedItemId ) | Navega até o item do feed específico, feedItemId, e a qualquer comentário associado. |
navigateToRelatedList(relatedListId, parentRecordId ) | Navega até a lista relacionada de parentRecordId. |
navigateToList(listViewId, listViewName, scope ) | Navega para o modo de exibição de lista especificado por listViewId, que é a ID do modo de exibição de lista a ser mostrada. |
createRecord(entityName [, recordTypeId ]) | Abre a página para criar um novo registro para o entityName especificado, por exemplo, “Account” ou “MyObject__c”. |
editRecord(recordId ) | Abre a página para editar o registro especificado por recordId. |
Para saber mais sobre o uso dessas funções e os parâmetros aceitos por elas, consulte Navegação e mensagens com o objeto sforce.one nos Recursos desta unidade.
Armadilhas de navegação e como corrigi-las
Não configurar window.location diretamente
OK, entendido, mas qual é a grande questão aqui? É muito simples. Uma vez no Lightning Experience, sua página não tem um window.location para configurar! Lembra daquela discussão anterior sobre o “contêiner” do Visualforce estando dentro de um iframe, e o Lightning Experience sendo um tipo de health club? (SPA—aplicativo de página única.) Esta é uma das coisas que resultam disso. O iframe do Visualforce não tem acesso direto ao valor window.location, portanto você não pode configurá-lo. Se seu código depende da configuração dele, irá quebrar. Ou seja, ações que desencadeiam a navegação configurando window.location irão simplesmente parar de navegar para o seu destino pretendido.
Há realmente uma maneira de contornar essa restrição, mas você não deve usá-la. O motivo é que se você contornar as funções de navegação em sforce.one, seus eventos de navegação não serão rastreados na pilha de navegação do Lightning Experience. Essa pilha fornece recursos úteis, como botões Voltar, que diz respeito a redirecionamentos, e similares. Uma série de recursos no Lightning Experience (e especialmente no aplicativo Salesforce) precisa que essa pilha contenha todos os eventos de navegação. Vale a pena assegurar o uso correto da pilha.
A questão do Salesforce Classic
Sim, ainda tem essa...coisa. Infelizmente, o objeto do utilitário sforce.one não está disponível quando sua página é executada no Salesforce Classic. Neste contexto, você deve usar o window.location. A boa notícia é que, no Salesforce Classic, o window.location está disponível. A má notícia é que essa limitação significa que você terá que adicionar um bloco if feioso no seu código. Considere envolver suas funções de navegação em métodos de utilitário que lidem com essa complexidade, de modo que sua lógica de navegação principal possa ser clara.
URLs estáticos
- Na marcação Visualforce, use {!URLFOR($Action.Contact.Edit, recordId)}
- No JavaScript, use navigateToSObject(recordId)
Recursos
- Trailhead: Navigation and Setup in Lightning Experience
- Trailhead: Personalização: Criar botões e links personalizados
- Guia do desenvolvedor do Visualforce: PageReference Class
- Guia do desenvolvedor do Visualforce: Dynamic References to Action Methods Using $Action
- Guia do desenvolvedor do aplicativo Salesforce móvel: Navigation and Messaging with the sforce.one Object