SlideShare uma empresa Scribd logo
Angular >= 2
One Framework Mobile & Desktop
Palestrante - Dalton Salvatti
● Técnico e Engenheiro Eletricista com ênfase em eletrônica e telecomunicações
● MBA em Gestão empresarial Integrada Através de Sistemas ERP
● SAP FI Consultant
● 38 anos de experiência no desenvolvimento de softwares
● 20 anos de experiência no desenvolvimento de soluções empresariais
● 5 anos de experiência como Cientista de Dados
● Atualmente está:
○ desenvolvendo uma plataforma Low Code - MyDevBot
○ desenvolvendo um adaptador para a documentação eletrônica na Agrofértil
● Tecnologias: Java, Typescript, Angular, SQL, Computação em Nuvem, BI e IA.
Porque Angular
1. Linguagem Typescript muito semelhante ao Java.
2. Usa componentes reutilizáveis para criar as interfaces.
3. Pode ser usado tanto em Mobile, Browser e até mesmo em Desktop.
4. Muitas bibliotecas disponíveis.
5. Boa documentação.
6. Bom ambiente de desenvolvimento.
“Foco na manutenção do código e não em sua construção”
Estudo de Caso - Interface MyDevBot
1. Autorização OAuth2 (via Google/Facebook)
2. Componentes proprietários Menu, Tooltip, Formulário, Grade de navegação
3. Drag & Drop de paineis
4. Cadastro master-slave
5. Atualização real-time de valores com regras armazenadas em servidor
6. Interface de comunicação instantânea via sockets
Estrutura de um Projeto
1. App - Arquivos de inicialização do sistema
2. Components - componentes reutilizaveis
3. Core - biblioteca de utilitários
4. Objects - armazena dados de execução
5. Services - regras de negócio
6. Pipes - opcional
App - Arquivos de inicialização do sistema
@NgModule({
imports: [BrowserMod………...erModule.forRoot(routes)],
providers: [Title, Authenticati…...penOrNewTable],
declarations: [App, Login, Ma…………...omOther],
entryComponents: [TooltipContent],
bootstrap: [App]
})
Exemplo de Um Componente - Navegação
@Component ({
selector: 'cadastroNavegacao' ,
template: `
<div class="navegacao">
<div tabIndex='0' class="scrollArea"
(scroll)="onScroll($event)" (mousemove)="mouseMoving($event)"...>
<table>
<th[style.transform]="translateXY"....>
<div><span>ID</span><span...></span></div></th>
<th *ngFor="let sysViewItem of _sysEscopo.getSysViewItemsWoPriKey(); index as col;"
[style.transform]="translateY">
<div><span>{{sysViewItem.columnName}}</span><span></span></div></th>
<tr *ngFor="let sysRegistroI of getSysRegistros(); index as row;" #register...>
<td style.transform]="translateX"...>{{getLinhaId(sysRegistroI)}}</td>
<td *ngFor="let celula of getLinhaWoId(sysRegistroI); index as col;"...>
<div...>{{celula}}</div></td>
</tr>
<th...><div><span>&Sigma;</span><span></span></div></th>
<th...*ngFor="let celula of getSummaryWoId(); index as col;">
<div...>{{celula}}</div></th>
</table>
</div>
<menu... [anchor]="xxxxx" [sysActions]="xxx" [sysTarefas]="xxx" (execTask)="xxx"></menu>
<menu ...></menu>
</div>` ,
Classe de um Componente - Construtor
constructor(private changeDetectorRef : ChangeDetectorRef ,
private sysEscopoManager : SysEscopoManager ,
private ifDataTypeManager : IfDataTypeManager ,
private formatter: Formatter) {
Classe de Um Componente - Input
@Input()
set sysEscopo(sysEscopo: SysEscopo) {
if (_sysEscopo === this._sysEscopo) return;
if (this.sysEscopo !== undefined) {
this.sysEscopoWasInvalidated.unsubscribe();
this.sysEscopoWasRefreshed.unsubscribe();
this.sysValorsWasUpdated.unsubscribe();
}
this._sysEscopo = sysEscopo;
if (sysEscopo !== undefined) {
this.sysEscopoWasRefreshed =
sysEscopo.sysEscopoWasRefreshed.subscribe(() => {
this.changeDetectorRef.markForCheck();
});
this.sysValorsWasUpdated =
sysEscopo.sysValorsWasUpdated.subscribe(() => {
this.changeDetectorRef.markForCheck();
});
}
}
Classe de Um Componente - Obtendo dados
getSysRegistros (): SysRegistro[] {
return this.sysEscopoManager .getSysRegistros (this._sysEscopo);
}
getLinhaId(sysRegistro: SysRegistro): string {
if (!sysRegistro) return '~';
const linhaId = sysRegistro.id;
if (!sysRegistro.changedAt) return linhaId;
if (!sysRegistro.savedAt) return linhaId + ' >';
if (sysRegistro.changedAt > sysRegistro.savedAt) return linhaId + ' >';
return linhaId;
}
Core - Biblioteca de Utilitários de Conversão
/**
* Converte um array de strings para uma relaçào de strings
* separados por ", " (virgula).
* Acrescenta aspas se necessário.
*/
public static toLista(valores: string[], separador: string = ', ', charAspa: string = '''): string
{
if (valores == null) return null;
let lista: string;
let i = 0;
for (let valor of valores) {
if (valor == null) continue;
if (i > 0) lista += separador;
if (charAspa.length > 0) valor = valor.replace(charAspa, charAspa + charAspa);
lista += charAspa + valor + charAspa;
i++;
}
return lista.toString();
}
Objects - Exemplo SysTabela
export class SysTabela {
/** Código da tabela formatada no banco de dados.
readonly id: number;
/** Nome técnico da tabela. */
readonly name: string;
/** Pacote ao qual a tabela pertence. */
readonly packageId: number;
readonly sysPackage: SysPackage;
/**
* Nome amigável da tabela
* Usado apenas para fornecer título e referencia amigável ao usuário.
* Também pode ser usada como chave para sistemas multilinguais.
*/
readonly alias: string;
Object SysTabela - Continuação
/**
* Relação de campos da Tabela Formatada.
* Usado para armazenar os objetos SysCampos da tabela para orientar
* a apresentação das informações na tabela de detalhes dos formulários de cadastro.
*/
readonly sysCampoById: {[key: number]: SysCampo; } = {};
readonly sysCampoByName: {[key: string]: SysCampo; } = {};
readonly sysCampos: SysCampo[] = [];
readonly sysViewItems: SysViewItem[] = [];
sysLigacaos: SysLigacao[];
Object SysTabela - Construtor
constructor(objTabela: any) {
this.id = objTabela.id;
this.packageId = objTabela.packageId;
if (objTabela.sysPackage)
this.sysPackage = new SysPackage(objTabela.sysPackage);
this.name = objTabela.name;
this.alias = objTabela.alias;
this.ordem = objTabela.ordem;
const objSysCampos = objTabela.sysCampos;
for (const objSysCampo of objSysCampos) {
const sysCampo = new SysCampo(this.id, objSysCampo);
const id = sysCampo.id;
const name = sysCampo.name;
this.sysCampoById[id] = sysCampo;
this.sysCampoByName[name] = sysCampo;
this.sysCampos.push(sysCampo);
}
...
Object SysTabela - Serializador Json
public toJson(): any {
const type = SysTabela.name;
const id = this.id;
const name = this.name;
return {type, id, name};
}
Serviço - SysTabelaManager
@Injectable()
export class SysTabelaManager {
private relativeUrlTabela = 'metadata/tabela/${tabelaId}';
public sysTabelaByCode: { [id: number]: SysTabela } = {};
private sysAbas: SysAbas;
sysTabelaWasInvalidated = new EventEmitter<SysTabela>();
constructor (private restClient: RestClient) {
this.readSysAbas();
}
....
}
Serviço SysTabelaManager - Continuação
async getSysTabela(sysTabelaId: number): Promise<SysTabela> {
if (!sysTabelaId) return undefined;
let sysTabela = this.sysTabelaByCode[sysTabelaId];
if (sysTabela !== undefined) return sysTabela;
const args = new Map<string, string>();
args.set('${tabelaId}', sysTabelaId.toString());
try {
const json = await this.restClient.getAsPromise(this.relativeUrlTabela, args);
if (!json) return undefined;
sysTabela = new SysTabela(json);
this.sysTabelaByCode[sysTabelaId] = sysTabela;
setTimeout(() => this.readSysLigacaos(sysTabelaId));
return sysTabela;
} catch (error) {
return undefined;
}
}
Pipe - NoSanitize
@Pipe({ name: 'noSanitize' })
export class NoSanitize implements PipeTransform {
constructor(private domSanitizer: DomSanitizer) {}
transform(html: string): SafeHtml {
return this.domSanitizer.bypassSecurityTrustHtml(html);
}
}
<td class="image" [innerHtml]="getHtmlImage(sysActionI) | noSanitize"></td>
Perguntas?

Mais conteúdo relacionado

ODP
Tw Course Ajax 2007 Ap05
PDF
Aula 12 Relatório - Tabelas
PPTX
Aula 5 PHP - Criação de sites II
PDF
LabMM4 (T22 - 12/13) - segurança
ODP
Workshop - Desenvolvimento web com Drupal 7
PPTX
Arrays PHP - Criação de sites II
PPTX
Introdução ao PHP - Criação de sites II
KEY
Python 04
Tw Course Ajax 2007 Ap05
Aula 12 Relatório - Tabelas
Aula 5 PHP - Criação de sites II
LabMM4 (T22 - 12/13) - segurança
Workshop - Desenvolvimento web com Drupal 7
Arrays PHP - Criação de sites II
Introdução ao PHP - Criação de sites II
Python 04

Mais procurados (7)

PPT
Java Básico :: Java Console
PDF
PHP MySQL Aula 07
PDF
Mini Curso PHP Twig - PHP Conference 2017
PPT
PHP GERAL
PDF
Clean Code Matters!
KEY
Python 05
PDF
Linguagem PHP
Java Básico :: Java Console
PHP MySQL Aula 07
Mini Curso PHP Twig - PHP Conference 2017
PHP GERAL
Clean Code Matters!
Python 05
Linguagem PHP
Anúncio

Semelhante a Angular >= 2 - One Framework Mobile & Desktop (20)

PPTX
Aula 7 pc - estrutura
PDF
Apostila aed
PPTX
Linguagem C - Estruturas
PDF
SUIT CSS como padrão de escrita de estilos
PPT
RYSYS Overview
PPTX
Criando APIs com Node e TypeScript
PDF
O SQL Server é um sistema de gestão de banco de dados relacional, desenvolvid...
PDF
O SQL Server é um sistema de gestão de banco de dados relacional, desenvolvid...
ODP
Palestra cbq
PDF
Workshop Django
PPTX
Desenvolvendo com Silverlight para WP7 Mango [Update]
ODP
Django + extjs pelos forms
PDF
Aplicações com Tecnologias Web
PPTX
Apresentação interbase (atualização 2)
PPT
Mini Curso de jQuery Lambda3/Globalcode
PDF
Wicket 2008
ODP
Aula c++ estruturas de dados
PPT
Banco de Dados XML
PPT
Bd sql (1)
KEY
Programação Orientada a Testes
Aula 7 pc - estrutura
Apostila aed
Linguagem C - Estruturas
SUIT CSS como padrão de escrita de estilos
RYSYS Overview
Criando APIs com Node e TypeScript
O SQL Server é um sistema de gestão de banco de dados relacional, desenvolvid...
O SQL Server é um sistema de gestão de banco de dados relacional, desenvolvid...
Palestra cbq
Workshop Django
Desenvolvendo com Silverlight para WP7 Mango [Update]
Django + extjs pelos forms
Aplicações com Tecnologias Web
Apresentação interbase (atualização 2)
Mini Curso de jQuery Lambda3/Globalcode
Wicket 2008
Aula c++ estruturas de dados
Banco de Dados XML
Bd sql (1)
Programação Orientada a Testes
Anúncio

Mais de GDGFoz (20)

PPTX
Apresentação GDG Foz 2023
PDF
Desenvolvimento de um Comedouro para cães com Acionamento Automático e Remoto
PDF
Introdução do DEVSECOPS
PDF
Aquisição de dados IoT com Event Sourcing e Microservices
PPTX
Robótica Sucational
PDF
A nova era do desenvolvimento mobile
PDF
Qualidade em Testes de Software
PDF
WebAssembly além da Web - Casos de Uso em IoT
PDF
Dart e Flutter do Server ao Client Side
PDF
UX: O que é e como pode influenciar a vida do desenvolvedor?
PPTX
Dicas de como entrar no mundo do DevSecOps
PDF
Automação Residencial Extrema com Opensource
PDF
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
PDF
Desmistificando a programação funcional
PDF
Microsserviços com Kotlin
PDF
Autenticação de dois fatores
PDF
Fique em casa seguro (ou tente)!
PDF
Hooks em React: o novo jeito de fazer componentes funcionais
PDF
Angular, React ou Vue? Comparando os favoritos do JS reativo
PDF
Styled Components - Estilizando components sem stress - Roberto Tauille
Apresentação GDG Foz 2023
Desenvolvimento de um Comedouro para cães com Acionamento Automático e Remoto
Introdução do DEVSECOPS
Aquisição de dados IoT com Event Sourcing e Microservices
Robótica Sucational
A nova era do desenvolvimento mobile
Qualidade em Testes de Software
WebAssembly além da Web - Casos de Uso em IoT
Dart e Flutter do Server ao Client Side
UX: O que é e como pode influenciar a vida do desenvolvedor?
Dicas de como entrar no mundo do DevSecOps
Automação Residencial Extrema com Opensource
Brasil.IO COVID-19: Dados por Municípios. Quais os Desafios?
Desmistificando a programação funcional
Microsserviços com Kotlin
Autenticação de dois fatores
Fique em casa seguro (ou tente)!
Hooks em React: o novo jeito de fazer componentes funcionais
Angular, React ou Vue? Comparando os favoritos do JS reativo
Styled Components - Estilizando components sem stress - Roberto Tauille

Último (19)

PPTX
Aula 18 - Manipulacao De Arquivos python
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Aula 18 - Manipulacao De Arquivos python
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula04-Academia Heri- Tecnologia Geral 2025
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Custos e liquidação no SAP Transportation Management, TM130 Col18
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Apple Pippin Uma breve introdução. - David Glotz
COBITxITIL-Entenda as diferença em uso governança TI
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Processos na gestão de transportes, TM100 Col18
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...

Angular >= 2 - One Framework Mobile & Desktop

  • 1. Angular >= 2 One Framework Mobile & Desktop
  • 2. Palestrante - Dalton Salvatti ● Técnico e Engenheiro Eletricista com ênfase em eletrônica e telecomunicações ● MBA em Gestão empresarial Integrada Através de Sistemas ERP ● SAP FI Consultant ● 38 anos de experiência no desenvolvimento de softwares ● 20 anos de experiência no desenvolvimento de soluções empresariais ● 5 anos de experiência como Cientista de Dados ● Atualmente está: ○ desenvolvendo uma plataforma Low Code - MyDevBot ○ desenvolvendo um adaptador para a documentação eletrônica na Agrofértil ● Tecnologias: Java, Typescript, Angular, SQL, Computação em Nuvem, BI e IA.
  • 3. Porque Angular 1. Linguagem Typescript muito semelhante ao Java. 2. Usa componentes reutilizáveis para criar as interfaces. 3. Pode ser usado tanto em Mobile, Browser e até mesmo em Desktop. 4. Muitas bibliotecas disponíveis. 5. Boa documentação. 6. Bom ambiente de desenvolvimento. “Foco na manutenção do código e não em sua construção”
  • 4. Estudo de Caso - Interface MyDevBot 1. Autorização OAuth2 (via Google/Facebook) 2. Componentes proprietários Menu, Tooltip, Formulário, Grade de navegação 3. Drag & Drop de paineis 4. Cadastro master-slave 5. Atualização real-time de valores com regras armazenadas em servidor 6. Interface de comunicação instantânea via sockets
  • 5. Estrutura de um Projeto 1. App - Arquivos de inicialização do sistema 2. Components - componentes reutilizaveis 3. Core - biblioteca de utilitários 4. Objects - armazena dados de execução 5. Services - regras de negócio 6. Pipes - opcional
  • 6. App - Arquivos de inicialização do sistema @NgModule({ imports: [BrowserMod………...erModule.forRoot(routes)], providers: [Title, Authenticati…...penOrNewTable], declarations: [App, Login, Ma…………...omOther], entryComponents: [TooltipContent], bootstrap: [App] })
  • 7. Exemplo de Um Componente - Navegação @Component ({ selector: 'cadastroNavegacao' , template: ` <div class="navegacao"> <div tabIndex='0' class="scrollArea" (scroll)="onScroll($event)" (mousemove)="mouseMoving($event)"...> <table> <th[style.transform]="translateXY"....> <div><span>ID</span><span...></span></div></th> <th *ngFor="let sysViewItem of _sysEscopo.getSysViewItemsWoPriKey(); index as col;" [style.transform]="translateY"> <div><span>{{sysViewItem.columnName}}</span><span></span></div></th> <tr *ngFor="let sysRegistroI of getSysRegistros(); index as row;" #register...> <td style.transform]="translateX"...>{{getLinhaId(sysRegistroI)}}</td> <td *ngFor="let celula of getLinhaWoId(sysRegistroI); index as col;"...> <div...>{{celula}}</div></td> </tr> <th...><div><span>&Sigma;</span><span></span></div></th> <th...*ngFor="let celula of getSummaryWoId(); index as col;"> <div...>{{celula}}</div></th> </table> </div> <menu... [anchor]="xxxxx" [sysActions]="xxx" [sysTarefas]="xxx" (execTask)="xxx"></menu> <menu ...></menu> </div>` ,
  • 8. Classe de um Componente - Construtor constructor(private changeDetectorRef : ChangeDetectorRef , private sysEscopoManager : SysEscopoManager , private ifDataTypeManager : IfDataTypeManager , private formatter: Formatter) {
  • 9. Classe de Um Componente - Input @Input() set sysEscopo(sysEscopo: SysEscopo) { if (_sysEscopo === this._sysEscopo) return; if (this.sysEscopo !== undefined) { this.sysEscopoWasInvalidated.unsubscribe(); this.sysEscopoWasRefreshed.unsubscribe(); this.sysValorsWasUpdated.unsubscribe(); } this._sysEscopo = sysEscopo; if (sysEscopo !== undefined) { this.sysEscopoWasRefreshed = sysEscopo.sysEscopoWasRefreshed.subscribe(() => { this.changeDetectorRef.markForCheck(); }); this.sysValorsWasUpdated = sysEscopo.sysValorsWasUpdated.subscribe(() => { this.changeDetectorRef.markForCheck(); }); } }
  • 10. Classe de Um Componente - Obtendo dados getSysRegistros (): SysRegistro[] { return this.sysEscopoManager .getSysRegistros (this._sysEscopo); } getLinhaId(sysRegistro: SysRegistro): string { if (!sysRegistro) return '~'; const linhaId = sysRegistro.id; if (!sysRegistro.changedAt) return linhaId; if (!sysRegistro.savedAt) return linhaId + ' >'; if (sysRegistro.changedAt > sysRegistro.savedAt) return linhaId + ' >'; return linhaId; }
  • 11. Core - Biblioteca de Utilitários de Conversão /** * Converte um array de strings para uma relaçào de strings * separados por ", " (virgula). * Acrescenta aspas se necessário. */ public static toLista(valores: string[], separador: string = ', ', charAspa: string = '''): string { if (valores == null) return null; let lista: string; let i = 0; for (let valor of valores) { if (valor == null) continue; if (i > 0) lista += separador; if (charAspa.length > 0) valor = valor.replace(charAspa, charAspa + charAspa); lista += charAspa + valor + charAspa; i++; } return lista.toString(); }
  • 12. Objects - Exemplo SysTabela export class SysTabela { /** Código da tabela formatada no banco de dados. readonly id: number; /** Nome técnico da tabela. */ readonly name: string; /** Pacote ao qual a tabela pertence. */ readonly packageId: number; readonly sysPackage: SysPackage; /** * Nome amigável da tabela * Usado apenas para fornecer título e referencia amigável ao usuário. * Também pode ser usada como chave para sistemas multilinguais. */ readonly alias: string;
  • 13. Object SysTabela - Continuação /** * Relação de campos da Tabela Formatada. * Usado para armazenar os objetos SysCampos da tabela para orientar * a apresentação das informações na tabela de detalhes dos formulários de cadastro. */ readonly sysCampoById: {[key: number]: SysCampo; } = {}; readonly sysCampoByName: {[key: string]: SysCampo; } = {}; readonly sysCampos: SysCampo[] = []; readonly sysViewItems: SysViewItem[] = []; sysLigacaos: SysLigacao[];
  • 14. Object SysTabela - Construtor constructor(objTabela: any) { this.id = objTabela.id; this.packageId = objTabela.packageId; if (objTabela.sysPackage) this.sysPackage = new SysPackage(objTabela.sysPackage); this.name = objTabela.name; this.alias = objTabela.alias; this.ordem = objTabela.ordem; const objSysCampos = objTabela.sysCampos; for (const objSysCampo of objSysCampos) { const sysCampo = new SysCampo(this.id, objSysCampo); const id = sysCampo.id; const name = sysCampo.name; this.sysCampoById[id] = sysCampo; this.sysCampoByName[name] = sysCampo; this.sysCampos.push(sysCampo); } ...
  • 15. Object SysTabela - Serializador Json public toJson(): any { const type = SysTabela.name; const id = this.id; const name = this.name; return {type, id, name}; }
  • 16. Serviço - SysTabelaManager @Injectable() export class SysTabelaManager { private relativeUrlTabela = 'metadata/tabela/${tabelaId}'; public sysTabelaByCode: { [id: number]: SysTabela } = {}; private sysAbas: SysAbas; sysTabelaWasInvalidated = new EventEmitter<SysTabela>(); constructor (private restClient: RestClient) { this.readSysAbas(); } .... }
  • 17. Serviço SysTabelaManager - Continuação async getSysTabela(sysTabelaId: number): Promise<SysTabela> { if (!sysTabelaId) return undefined; let sysTabela = this.sysTabelaByCode[sysTabelaId]; if (sysTabela !== undefined) return sysTabela; const args = new Map<string, string>(); args.set('${tabelaId}', sysTabelaId.toString()); try { const json = await this.restClient.getAsPromise(this.relativeUrlTabela, args); if (!json) return undefined; sysTabela = new SysTabela(json); this.sysTabelaByCode[sysTabelaId] = sysTabela; setTimeout(() => this.readSysLigacaos(sysTabelaId)); return sysTabela; } catch (error) { return undefined; } }
  • 18. Pipe - NoSanitize @Pipe({ name: 'noSanitize' }) export class NoSanitize implements PipeTransform { constructor(private domSanitizer: DomSanitizer) {} transform(html: string): SafeHtml { return this.domSanitizer.bypassSecurityTrustHtml(html); } } <td class="image" [innerHtml]="getHtmlImage(sysActionI) | noSanitize"></td>