π Custom RxJS operators 7/7: "
#angular #rxjs #toLatestFrom
The built-in
operator
toLatestFrom operator"#angular #rxjs #toLatestFrom
The built-in
withLatestFrom operator allows to add data from supplementary streams to the source stream. However, sometimes the source stream is just a trigger to perform a certain action for which data from supplementary streams is needed. As a result, the array of elements in the output stream contains a dummy first element. A better solution is to neglect the value from the trigger.operator
function toLatestFrom<T, D1>(d1$: ObservableInput<D1>): OperatorFunction<T, D1>;
function toLatestFrom<T, D1, D extends unknown[]>(
d1$: ObservableInput<D1>,
...data$: [...ObservableInputTuple<D>]
): OperatorFunction<T, [D1, ...D]>;
function toLatestFrom<D1, D extends unknown[]>(
d1$: ObservableInput<D1>,
...data$: [...ObservableInputTuple<D>]
) {
return pipe(
withLatestFrom(d1$, ...data$),
map(([_, ...data]) => (data.length === 1 ? data[0] : data))
);
}
π₯1
π Change Detection in Angular
#angular #signals #cdr
4. Local Change Detection π©Angular 17
β Article link: https://medium.com/ngconf/local-change-detection-in-angular-410d82b38664
#angular #signals #cdr
4. Local Change Detection π©Angular 17
@Component({
selector: 'app-timer',
template: `<span>Last Updated: {{ lastUpdateInSeconds() | number:'1.0-0' }} Seconds</span> {{ logCd() }}`,
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [DatePipe, DecimalPipe, AsyncPipe]
})
export class TimerComponent {
@Input() lastUpdate = new Date();
lastUpdateInSeconds = signal(0)
constructor() {
setInterval(() => {
this.lastUpdateInSeconds.set((new Date().getTime() - this.lastUpdate.getTime()) / 1_000);
}, 1000);
}
logCd() {
console.log('log from timer');
}
}β Article link: https://medium.com/ngconf/local-change-detection-in-angular-410d82b38664
π₯1π₯°1
π Transitioning to Angular 17βs New Control Flow Syntax
#angular #controlFlow
π© > Angular v17
β Article link: https://medium.com/@dimeloper/transitioning-to-angular-17s-new-control-flow-syntax-0555aa45f06f
#angular #controlFlow
π© > Angular v17
β Article link: https://medium.com/@dimeloper/transitioning-to-angular-17s-new-control-flow-syntax-0555aa45f06f
π₯1
π Exploring the New
#js #groupBy
β Article link: https://medium.com/@bhargavr445/exploring-the-new-object-groupby-function-in-chrome-117-028820848433
Object.groupBy Function in Chrome 117#js #groupBy
β Article link: https://medium.com/@bhargavr445/exploring-the-new-object-groupby-function-in-chrome-117-028820848433
π₯1
π Card Composite via @ViewChildren in Angular
#angular #decorator #ViewChildren
β Article link: https://blog.stackademic.com/card-composite-via-viewchildren-in-angular-aa3317f92f82
#angular #decorator #ViewChildren
Imagine the following requirements for your Angular app:
- Your customer wants a view that displays multiple cards at once.
- A button at the top of the page should toggle the edit mode.
- While in edit mode, all cards are editable at the same time.
- As soon as you click βsaveβ only those cards that actually have been edited are going to send a request to the server.
- If you decide to discard the changes by clicking on βcancelβ all cards should be reset to their initial state.
This is a common scenario in any more sophisticated web application. Nevertheless, I just recently discovered a very handy way to handle those requirements in Angular. In this article I want to share my solution, leveraging the @ViewChildren property decorator to implement the Card Composite pattern.
β Article link: https://blog.stackademic.com/card-composite-via-viewchildren-in-angular-aa3317f92f82
π2π₯1
π Angular Interceptors: Authentication Interceptor
#angular #interceptor
#angular #interceptor
An authentication interceptor is used to add authentication tokens to outgoing requests and handle authentication-related errors. This is essential for securing your applicationβs API requests.
import { Injectable } from '@angular/core';
import {
HttpInterceptor,
HttpRequest,
HttpHandler,
} from '@angular/common/http';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler) {
const authToken = 'your-auth-token';
const authRequest = request.clone({
headers: request.headers.set('Authorization', `Bearer ${authToken}`),
});
return next.handle(authRequest);
}
}π₯2
π Cross-Site Scripting (XSS) Attacks
#angular #xss
β Article link: https://rahuulmiishra.medium.com/mitigating-cross-site-scripting-xss-attacks-best-practices-and-code-examples-a5e4fd9d67a6
#angular #xss
β Article link: https://rahuulmiishra.medium.com/mitigating-cross-site-scripting-xss-attacks-best-practices-and-code-examples-a5e4fd9d67a6
π₯1