---
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**!

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 (`