Angular 7 – Injecting a State/Context Snapshot


Requirement

There is some (for arguments sake) “global” application state that I am interested in injecting into components.

Each candidate component should receive an immutable snapshot of the state as it existed at the time that its constructor was invoked (for absolute clarity, the state snapshot that is injected into each component’s constructor must not change when the global state changes).

Constraints

I cannot (and do not wish to) use a root-level service or global constant from which components request a state snapshot. Such a solution would require that a component must explicitly request a state snapshot (from the injected service or global constant) from within its constructor, because if it attempted to retrieve it later in its lifecycle, the state might have changed and no longer be relevant to it.

I want to avoid having to declare an injected service locally within each client component’s providers array. This is unnecessarily burdensome. Clients should be able to simply inject a type (or injection token) and receive a state snapshot.

Problem

Although an injection factory method seemed on the surface to be an obvious solution (it would copy the global state and return it to the injector, which would in turn pass it to the component’s constructor), the factory is only invoked once (for each level in the injection hierarchy for which a provider has been configured). I understand that this is by design, however I think that there is a good use-case for the functionality I have described.

What would potentially work is an injection factory implementation similar in concept to Angular pure and impure pipes, where a factory (or potentially any injection configuration) could be declared “impure”, which would result in a new instance being injected into every dependent component.

Surely there is a way to do this?

What’s a clean way to manage state in Angular and have components update?

I’m using a service to manage state in Angular:

import { Injectable } from '@angular/core'; import { Subject } from 'rxjs';  @Injectable() export class DrawingAreaService {   itemChange: Subject<string> = new Subject();    private foo = 'foo';    get bar() {     return this.foo;   }    set bar(value) {     this.foo = value;     this.itemChange.next(value);   } } 

And in my component I have

get bar() {   return this.service.bar; }  ngOnInit() {   this.service.bar = 'test value'; } 

html:

{{ this.bar }} 

Calling the service and updating bar value on init does not trigger the component changes. If instead I also set to a field on the component, something like:

this.service.bar = 'test value'; this.bar = 'test value'; 

it triggers the change detection.

I’m wondering what’s the best way to handle state changes like this, should I set on the service only and then call detectChanges()? Should I subscribe and set a class field from the subscription? Should I set twice?

Is there any other way to do this? How can I do it in a really simple way?

ngx-bootstrap + angular 6 + datepicker

Olá,

Estou utilizando o datepicker do ngx-bootstrap pela primeira vez e estou encontrando algumas dificuldades.

Uma delas é que ao selecionar a data desejada, meu input fica no formato exato que eu preciso, da seguinte maneira: ’20/12/2018′, porém quando jogo no console o valor do input, é apresentado da seguinte maneira: ‘Thu Dec 20 2018 23:26:21 GMT-0200 (Horário de Verão de Brasília)’.

Como eu faço para deixar o valor do input com o formato brasileiro: ’20/12/2018′. Procurei na documentação do mesmo e não encontrei.

Evidencias de como está funcionando(errado).

inserir a descrição da imagem aqui

Evidencia das propriedades:

inserir a descrição da imagem aqui

Specify NPM module platform to use in Angular

I have an existing Angular app that works a charm in Chrome but fails on (obviously) Internet Explorer. What’s happening is this:

Several of the NPM modules I install come with different distributions. So for example, the folder structure under kendo-angular-charts looks like this:

- dist    |- cdn    |- es    |- es2015    |- npm    |- systemjs 

When the site breaks in IE, it’s because of the following declaration in es2015\common\configuration.service.js:

export class Change {     constructor(key, value) {         this.key = key;         this.value = value;     } } 

It breaks (invalid syntax error) because ES2015 classes are not supported in Internet Explorer. But there is also a perfectly valid ES5 version of the file in the es folder.

So how do I use that instead?

I have checked angular.json and package.json for options that seem related, but couldn’t find anything.

SPFX Angular Element with UI-Router not displaying data

Iam testing Angular Element with SharePoint Framework (SPFX) Webpart, as Andrew Conell has described in his Blog

Every thing is working as asspected, i have added UI-Router in webpart just for testing how it works with Angular Element inside SPFX webpart. And as asspected routing is working, but no data is displayed on the MainComponent (Main page). I have added some test data in main.component.ts as below:

`public data: any[]; public heroes = [ {id: 1, name:’Superman’}, {id: 2, name:’Batman’}, {id: 5, name:’BatGirl’}, {id: 3, name:’Robin’}, {id: 4, name:’Flash’} ]; public test:string;

constructor(){   let t = "main page...";   this.test = t;   this.data = this.heroes;   console.log(JSON.stringify(this.data)); } 

`

And in main.component.html:

<span>{{test}}</span> <table> <thead> <th>Name</th> <th>Index</th> </thead> <tbody> <tr *ngFor="let hero of data"> <td>{{hero.name}}</td> </tr> </tbody> </table>

And if i add same test data in my AppComponent then it works, data in table get displayed and even text string “test” is dislayed…

Here is my solution (SPFXAngularUIRouter) on GITHUB for testing…

I think i have same problom as described here

Angular 7: Dar biding em um objeto que vai receber um json de um HTTP GET

Digamos que eu tenha o objeto tipado:

x: Endereco  public interface Endereco {   rua: string;   numero: number; } 

E tenho um http GET que alimentará essa variável x. O problema é que no request eu recebo um json com o parâmetro “bairro” que eu não quero que vá para a minha variável x. Como eu faço pra ‘filtrar’ isso?

{   rua: "nome da rua",   numero: 34,   bairro: "Não quero isso" } 

Atualmente, faço dessa maneira:

http.get<Endereco>('url')    .subscribe(resposta => this.x = resposta) 

Aqui a variável X se transforma em um objeto com o parâmetro bairro, e eu não quero que aconteça isso.

Como Utilizar Curl com método POST no Angular?

Tenho um tipo de http.post que tem que ser via Curl, tipo este exxemplo:

curl -X POST -F 'files=@/path/to/pictures/avatar.jpg&refId=5a993616b8e66660e8baf45c&ref=user&source=users-permissions&field=avatar' http://localhost:1337/upload 

Como pode ver é de envio de imagem a um campo específico. Este curl é representado por este JSON:

{   "files": "...", // Buffer or stream of file(s)   "path": "user/avatar", // Uploading folder of file(s).   "refId": "5a993616b8e66660e8baf45c", // User's Id.   "ref": "user", // Model name.   "source": "users-permissions", // Plugin name.   "field": "avatar" // Field name in the User model. } 

Bem, fazendo desta forma:

Criando um input no html do meu component:

<input type="file" name="file" (change)="onFileSelected($  event)"> 

Criando seu evento:

onFileSelected(event) {     console.log(event); } 

Tenho vários resultados entre eles o file com:

files: FileList 0: File(58456) lastModified: 1542844204930 lastModifiedDate: Wed Nov 21 2018 21:50:04 GMT-0200 (Horário de Verão de Brasília) {} name: "8.jpg" size: 58456 type: "image/jpeg" webkitRelativePath: "" 

Que já me dá o nome da imagem e seu formato. Que é 0 files=@/path/to/pictures/avatar.jpg do Curl. Ok.

Fazendo:

this.selectedFile = event.target.files[0]; // me dá o nome da imagem e sua extensão 

Tenho também o redId que é o ID do meu usuário, tenho o nome do usuário, já tenho a permissão e o nome do campo.

Como posso usar o curl, mostrado no começo, com o metodo post no Angular, uma vez que já tenho todos os dados que preciso?

Ah, estou pegando estas informações desta documentação do Strapi.io: https://strapi.io/documentation/3.x.x/guides/upload.html#examples

Obrigado.

Links de rota do Angular não se ativam com o teclado. Como proceder?

O que eu quero

Criar um link para uma rota do angular (usando o atributo routerLink) e conseguir utilizar através do teclado (para acessibilidade), utilizando a tecla enter ou barra de espaço para ativar o link.

O problema

A partir do momento que eu coloco o atributo routerLink, não consigo mais utilizar as teclas enter/barra de espaços para ativar o link.

O que eu já tentei

Colocar o atributo role=”link”: mesmo resultado; Inserir o atributo href: mesmo resultado;

Observações

A tag <a>, por natureza, possui essa funcionalidade. É um elemento focável e pode ser ativado com o teclado, e gostaria de utilizar a funcionalidade nativa.