跳转到主要内容

标签(标签)

资源精选(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)

Angular引入信号已经有一段时间了,社区开始讨论这是前进还是后退。对我来说,这绝对是向前迈出的一步。

让我们快速回顾一下信号是什么,然后我们将快速介绍如何考虑您的公司应用程序以及如何重构它的步骤和技巧,讨论应该采取什么方法。

首先,在一开始,Angular团队采取了一种有点特殊的方法,并为所有事情引入了RxJs模式,即使在它不是最佳选择的用例中也是如此。例如,如果您想要发出HTTP请求、保存响应并在视图中显示它,则需要首先从Angular导入HttpClient,然后通过订阅它来调用API,或者使用.pipe()运算符创建另一个层。之后,您可以订阅它:

// API service
@Injectable()
export class FetchingApiService {
  constructor(private http: HttpClient) {}

  fetchTodos(): Observable<ToDoInterface[]> {
    return this.http.get<ToDoInterface[]>('https://jsonplaceholder.typicode.com/todos/');
  }
}

// facade service
@Injectable()
export class FetchingFacadeService {
  public allToDos$ = new BehaviorSubject(null);

  constructor(private fetchService: FetchingApiService) {}

  fetchTodos(): Observable<ToDoInterface[]> {
    return this.fetchService.fetchTodos().pipe(
      tap((todos: ToDoInterface[]) => {
        this.allToDos$.next(todos);
      })
    );
  }
}

// Component
  fetchTodos(): Observable<ToDoInterface[]> {
    return this.facade.fetchTodos();
  }

这种方法在很大程度上也依赖于Zone.js,它将重新渲染allToDos$,只是在向列表中添加新项目时渲染一次或几次。你可以在这个链接上查看我以前关于信号的文章:https://medium.com/@marekpanti/how-to-refactor-observable-patterns-to-angular-signals-3c998796e081

然而,对于信号,我们的方法会有所不同,我们将使用带有.fetch() api和async and await的javascript本地解决方案

// API Service
@Injectable()
export class FetchingApiService {
  async fetchTodosClassicApproach(): Promise<ToDoInterface[]> {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/');
    const todos = await response.json();
    return todos;
  }
}

// Facade

@Injectable()
export class FetchingFacadeService {
  public allTodosSignal = signal([]);

  constructor(private fetchService: FetchingApiService) {}

  async fetchTodos() {
    const myTodosResponse: ToDoInterface[] =
      await this.fetchService.fetchTodosClassicApproach();
    this.allTodosSignal.set(myTodosResponse);
  }

// Component .html
<div *ngFor="let todo of (facade.allTodosSignal())">

 

在这个解决方案中,我们保存了大量导入,同时,我们为下一个Angular版本准备了组件,当我们可以使用标志来指示组件正在使用信号,并且基本上不在Zone.js范围内时。

但是,当我们想更新应用程序以使用信号时,应该采取什么方法?

我建议创建三个票证:

1.重构所有component.ts,并使用.toSignal()方法将RxJs流更改为信号。有了这些,我们将有基于信号的观点,我们可以继续使用逻辑。

2.然后我将继续介绍服务和外观——在这里,您可以根据应用程序的层次和复杂性创建更多任务。所以我会把所有的.pipe()都改为计算信号。完成这一步骤后,基本上我们所有的应用程序都被重构了,但不要忘记最后一步。

const name = signal('John');
const lastName = signal('Doe');
// computed can use if and other function, so you don't need to chain your operators
const FullName = Signal<string> = computed(() => name + lastName);

3.更改所有使用httpClient for native解决方案的API调用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

总之,如果我们仔细考虑更改,并且已经清理了架构,那么重构应该很简单。多亏了Angular团队,我们可以使用.toSignal()等函数一步一步地完成这项工作,而且我们不必一步摆脱Zone.js。