--- title: 5 Erros comuns em widgets no TOTVS Fluig source: https://tdn.totvs.com/display/fluig/5+Erros+comuns+em+widgets+no+TOTVS+Fluig path: \Plataforma Documentação técnica\Recurso de Páginas e Widgets (WCM)\5 Erros comuns em widgets no TOTVS Fluig.md --- - [Erros comuns no desenvolvimento de widgets](#id-5ErroscomunsemwidgetsnoTOTVSFluig-Erroscomunsnodesenvolvimentodewidgets) - [Erro 1 - Escopo da super widget e o perigo das múltiplas instâncias](#id-5ErroscomunsemwidgetsnoTOTVSFluig-Erro1-Escopodasuperwidgeteoperigodasmúltiplasinstâncias) - [Erro 2 - Deixar dados fixos (Hardcoded) e ignorar o Style Guide](#id-5ErroscomunsemwidgetsnoTOTVSFluig-Erro2-Deixardadosfixos(Hardcoded)eignoraroStyleGuide) - [Erro 3 - Confundir bindings locais e globais](#id-5ErroscomunsemwidgetsnoTOTVSFluig-Erro3-Confundirbindingslocaiseglobais) - [Erro 4 - Não planejar o identificador (código) da widget](#id-5ErroscomunsemwidgetsnoTOTVSFluig-Erro4-Nãoplanejaroidentificador(código)dawidget) - [Erro 5 - Lentidão de requisições e conflito com "Template Literals"](#id-5ErroscomunsemwidgetsnoTOTVSFluig-Erro5-Lentidãoderequisiçõeseconflitocom"TemplateLiterals") # Erros comuns no desenvolvimento de *widgets* --- Desenvolver *widgets* no TOTVS Fluig exige o cumprimento de padrões arquiteturais específicos da plataforma (FreeMarker e Fluig Style Guide). Ignorar essas regras frequentemente causa falhas silenciosas de renderização, lentidão na interface, quebra de código ao migrar entre ambientes (Homologação para Produção) e conflitos visuais. Este guia documenta os 5 erros mais recorrentes entre desenvolvedores e apresenta as melhores práticas estruturais para evitá-los, para isso vamos ter como base um **exemplo prático**! ![](..\..\images\5erroswidget_1920px_8fps_128c_none_bicubic_rectangle.gif) Download do exemplo: Caso você tenha interesse em fazer o *download* do projeto que criamos para este exemplo, [clique aqui](https://tdn.totvs.com/download/attachments/1040986447/5erroscomunswidgets.zip?version=1&modificationDate=1777061311597&api=v2). ## Erro 1 - Escopo da super *widget* e o perigo das múltiplas instâncias --- A arquitetura do TOTVS Fluig é rigorosa no carregamento e instanciamento de uma *widget* na página. Se a estrutura global não for respeitada, o componente falhará ao renderizar. Os principais equívocos incluem: - **Usar ES6 na declaração principal:** a arquitetura do Fluig requer um escopo global que apenas a declaração `var` provê na raiz do arquivo. Utilizar `const` ou `let` para declarar a variável da SuperWidget impede de instanciar o objeto no `window`. - **Funções soltas:** é ideal manter toda a implementação dentro da SuperWidget e evitar criar funções fora dela, caso contrário, você não terá acesso aos atributos fornecidos por ela (como o `this.instanceId`). - **Divergência entre o ID da DIV principal e a variável JS:** o `id` da `div` encapsuladora nos arquivos `view.ftl` e `edit.ftl` possui a mesma nomenclatura base da variável JavaScript. Exemplo: se a div é `
`, a variável deve ser `var wExemplosPraticos = SuperWidget.extend({...});`. - **Ignorar o suporte a múltiplas instâncias na mesma página:** um desenvolvedor deve assumir que sua *widget* pode ser inserida duas ou mais vezes na mesma página. Para que ações de clique e manipulações de DOM não afetem a *widget* errada, **sempre** concatene o `${instanceId}` nos seletores de ID e utilize as funções de binding nativas. 1. Estrutura correta de instanciação: Sempre inicie sua *widget* com `var` e o nome idêntico ao código do projeto: **No javascript** ``` // ❌ INCORRETO (O Fluig não conseguirá colocar a widget na página) const wExemplosPraticos = SuperWidget.extend({ ... }); // ✅ CORRETO (Escopo Global garantido) var wExemplosPraticos = SuperWidget.extend({ // Nos métodos internos, o uso de let/const é liberado e encorajado! realizarBusca: function() { const termo = $(`#input-search_${this.instanceId}`).val(); } }); ``` 2. Cuidado com callbacks assíncronos (a perda do this): Em requisições AJAX, o contexto do `this` muda, fazendo você perder o acesso ao `this.instanceId`. **No javascript** ``` // ✅ CORRETO: Preservando o escopo do Fluig carregarDados: function() { var that = this; // Guarda a referência da Widget $.ajax({ url: '/api/...', success: function(response) { // Usa 'that' para manipular apenas a div da instância atual $('#resultado_' + that.instanceId).text(response.data); } }); } ``` O exemplo abaixo mostra o uso de **Arrow Functions** (`success: (data) => { ... }`), que é a abordagem moderna e limpa. Ela herda o `this` automaticamente da *widget*, eliminando a necessidade de criar variáveis de escape (como o antigo `var that = this`). **No javascript** ``` // ✅ CORRETO: Preservando o escopo do Fluig carregarDados: function() { $.ajax({ url: '/api/public/search/advanced', // ✅ CORRETO: Arrow function não cria novo escopo 'this' success: (data) => { console.log(this.instanceId); // Acessível com sucesso! } }); } ``` ## Erro 2 - Deixar dados fixos (Hardcoded) e ignorar o Style Guide --- **1. Hardcode de dados e ambientes** Anotar IDs fixos (pastas, formulários, *logins*) no código Javascript fará com que a *widget* quebre imediatamente ao ser exportada para outro ambiente. Ex.: de Homologação para Produção, onde os IDs são diferentes. A solução correta é criar uma tela de configuração (`edit.ftl`) para o administrador salvar esses dados usando a API `UPDATEPREFERENCES` nativa do Fluig e depois resgatá-los no `view.ftl` via FreeMarker. No arquivo Javascript (`.js`), capture e salve os dados: **Javascript** ``` savePreferences: function() { // Montamos um objeto com os valores preenchidos na tela de edição const preferences = { folderIdPref: $(`#folderId_${this.instanceId}`).val() || "0", limitPref: $(`#limit_${this.instanceId}`).val() || "15", orderingPref: $(`#ordering_${this.instanceId}`).val() }; // A API nativa grava isso com segurança no Fluig WCMSpaceAPI.PageService.UPDATEPREFERENCES({ async: true, success: () => { FLUIGC.toast({ title: 'Sucesso', message: 'Preferências salvas!', type: 'success' }); } }, this.instanceId, preferences); } ``` **2. A importância da identidade visual e uso do Style Guide** Um erro de UI/UX é criar telas com CSS customizado (`