跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) 聊天机器人(10) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) 编程语言(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)
Why and How Using Angular Signals I have updated this article after the release of Angular v16.0.0-next.7 Before we begin with Angular Signals 🚦, have you ever wondered how changes made in your model reflect in the view ? If you know how Angular detects changes and updates views, you can proceed to the next section about signals! 💨 When you make any updates to your model, Angular automatically applies those changes to the corresponding view. This enables a seamless and synchronized interaction between model and view, allowing for a smooth user experience. Believe me, it’s not by magic! 🧙‍♂️✨ The key to this synchronization is Change Detection and Zone js. Although CD and Zone js won’t be the focus of this article, we’ll briefly explore how Angular uses these tools to synchronize the view with models. Angular applications are built using a component-based architecture, where each component represents a specific feature or functionality. Angular application is a tree of components. By using zones and executing code within them, the framework can gain better visibility into the operations being performed. This enables it to handle errors more effectively, and most importantly, trigger change detection whenever somthing happens into the application (Asynchronous operation, DOM Event …) 1 : Zone.js detects when something happens in the application. 2 : Zone.js triggers change detection to update the application state. When change detection starts 🔥, the framework goes through all the components in the tree to verify if their state has changed or not and if the new state affects the view. If that’s the case, the DOM part of the component which is affected by the change is updated. This functionality have a significant impact on the performance of the application, it does work that may not be necessary, since the majority of components may not be affected by the event. We can optimize the application’s performance by changing the change detection strategy in component by using the OnPush strategy. However, this approach requires a careful attention. But why are you explaining this? This article is about Angular Signals, right? 😕 Yes, because Angular Signals can help us avoid this unnecessary checks😊 and update only the part of the application that has changed. So now we will learn about Angular Signals 🥳🥳🥳. Let’s go 🏃‍♀️ 🏃 🏃‍♀️ 🏃 Angular 🚦 Signals 📡 What are Angular Signals 🤔? Signals are a reactive value, technically are a zero-argument function [(() => T)] , when we execute it they return the value. We can say that signal is a special type of value that can be observed 🧐 for changes. How do we create a signal ? We create and initialize a signal by calling the function signal() // Signature of signal function export function signal(initialValue: T, options?: CreateSignalOptions): WritableSignal //Signature of CreateSignalOptions export interface CreateSignalOptions { /** * A comparison function which defines equality for signal values. */ equal?: ValueEqualityFn; } //How use it const movies = signal([]); The signal function is a TypeScript function that creates a Signal. It takes two arguments: initialValue : Represent the initial value of the signal, and it can be of any type T options is an object of the CreateSignalOptions type that includes an equal method for comparing two values of type T. If the options object is not provided when creating a signal, the defaultEquals function will be used instead. The defaultEquals function compares two values of the same type T using a combination of the === operator and the Object.is method The signal function returns a WritableSignal.Signal are a getter function, but the type WritableSignal give as the possibilty to modifiy the value by three methods : set [set(value: T): void] for replacement (set the signal to a new value, and notify any dependents) update[update(updateFn: (value: T) => T)] for deriving a new value (Update the value of the signal based on its current value, and notify any dependents), The update operation uses the set() operation for performing updates behind the scenes. mutate [mutate(mutatorFn: (value: T) => void)] for performing internal mutation of the current value (Update the current value by mutating it in-place, and notify any dependents) So Signal is a reactive value that can be observed, updated and notifiy any dependents. But what does it mean to notify any dependents😕 ? This is the magic 🪄 part of Signal. Now we will see what dependents are for Signals and how to notify them. Signal is not just a value that can be modified, it is more than that, Signal is a reactive value 🔃 and is a producer that notify consumers(dependents) when it changes. So dependents in Signal are any code that has registered an interest in the Signal’s value and wishes to be notified whenever the Signal’s value changes. When the Signal’s value is modified, the Signal will notify all of its dependents, allowing them to react to the change in the Signal’s value. This makes the Signal is the core element of a reactive application, as it allows different parts of the application to automatically update in response to changes in data. So, how we can add dependents (consumer) to Signal ? We can add consumers by using effect and computed functions. effect Sometimes, when a signal has a new value, we may need to add a side effect. To accomplish this, we can use the effect() function. Effect schedules and runs a side-effectful function inside a reactive context. Signature of the effect function : export function effect( effectFn: () => EffectCleanupFn | void, options?: CreateEffectOptions): EffectRef How use effect The function inside the effect will re-evaluate with any change that occurs in the signals called inside it. Multiple signals can be added to the effect function. 🔍 I will try to explain the work behind the effect function : 🔍 when we declare an effect function, the effectFn passed as an argument will be added to the list of the consumers of any signals used by the effectFn, such as movies in our example. (Signals used by the effectFn will be the producers). Then, when the signal has a new value by using the set, update, or mutate operators, the effectFn will be re-evaluated with the new signal value(The producer notifies all consumers of the new values). The effect() function returns an EffectRef, which is a global reactive effect that can be manually destroyed. An EffectRef has a destroy operation. destroy(): 🧹 Shut down the effect, removing it from any upcoming scheduled executions. computed What if there is another value that depends on the values of other signals, and needs to be recalculated 🔄 whenever any of those dependencies changes? In this case, we can use a computed() function to create a new signal that automatically updates whenever its dependencies change. computed()creates a memoizing signal, which calculates its value from the values of some number of input signals. Signature of the computed function : export function computed( computation: () => T, equal: ValueEqualityFn = defaultEquals): Signal How use computed So computed function will return another Signal, any signals used by computation will be tracked as dependencies, and the value of the new signal recalculated whenever any of those dependencies changes. Note that the computed function returns a Signal and not a WritableSignal, which means it cannot be manually modified using methods such as set, update, or mutate. Instead, it is updated automatically whenever one of its dependent parents signals changes. and now we can add and effect or create another signal with computed function based of this new Signal. Any change in values now will be propagated in the dependencies graph 🌳. That’s it 🤩! In this article, we’ve learned about Angular Signals, what they are, why we need them, and how to use them in our applications. I hope this has helped you understand the power of signals. To illustrate these concepts, I created a project 🎯 that explains Angular signals and demonstrates how to create and update signals, use effects, and create computed values. In the following GIF, you can see the application in action, and you can find the full code in this GitHub repository. If you find the code helpful, please feel free to give it a star⭐️. Thanks for reading, don’t forget to support this article with your 👏 to help share it with more people. And be sure to follow me in twitter or medium for more exciting articles in the future! 🔥