Angular 中的子父母沟通最佳实践

2023-12-11

我正在努力提高 Angular 的水平,并且想了解儿童与家长之间沟通的最佳实践。我当前想要使用的应用程序是 Angular 6。我知道我可以使用 @ViewChild、@Output 或创建服务在子父组件之间进行通信。还有其他方式进行沟通吗?如果不是,这三个中哪一个更好,为什么?

这是一个简单的例子:

子 HTML

<button (click)="onLinkedClicked();">Click me</button>

Child TS

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
.
.
.
export class showcaseMenuComponent implements OnInit {
    @Output() public linkedClicked = new EventEmitter<String>();

    constructor() {}

    onLinkedClicked() {
        console.log('on click child');
        this.linkedClicked.emit('collapsed');
    }
}

父 HTML

<showcase-menu #topNavMenu 
               [showBranding]="false"
               [showSearch]= "false"  
               (linkedClicked)="linkToggler($event)">. 
</showcase-menu>

父 TS

.
.
.
 navMenuState: string;
.
.
.
  linkToggler($event) {
    console.log("partent");
    this.navMenuState = $event;
  }

显然这取决于你想做什么。

@Input

通过使用@Input您直接将参数传递给子组件。 此外,您可以通过将一个组件放入另一个组件中来耦合组件。 这种方法很有用而且简单。

当您想要确保子组件集成到共享特定对象的父组件中并且不必关心同步机制时,这是一个很好的方法。

这意味着,如果更改对象的属性,对象引用仍然相同,因此它会更新为父级和组件。但是,如果您在一个组件中更改对象引用(例如实例化一个新对象或通过远程服务检索一个新对象),则另一个组件无法检测到对象更改,因此您将出现数据错位。

@Output

通过使用@Output您向上发出一个事件,因此当您想要向父级传达发生了某些事情时,此方法非常有用。数据交换是可能的,但这不是事情的重点。

重点是发生了一些事情,例如,在向导中,您可以有一些步骤,每个步骤都可以通知父组件该特定步骤已完成。父级不需要知道发生了什么,只要发生了就可以进入下一步。

@ViewChild

通过使用@ViewChild您正在将子组件引用到父组件中。

您通过混合逻辑来强制父组件让特定的子组件工作。

当您想要将子组件的某些方法调用到父组件中时,这非常有用。

使用向导示例,您可以考虑这种情况:

  • 我们有3步
  • 第三步完成并发出@Output给家长的事件
  • 父级捕获事件并尝试保存数据
  • 数据保存正常 => 父级告诉最后一步组件显示成功消息 或者
  • 数据保存失败 => 父级告诉最后一步组件显示失败消息

Service

通过使用外部服务,您可以将数据集中到一个负责管理和更新数据的外部对象中。

对于可以从远程服务检索数据或可以重新分配数据对象引用的情况,这是一种很好的方法。

此外,通过这种方法,您可以将所有组件相互解耦。他们可以工作而不必担心别人的行为。

一般来说Subject用于服务通信。

你可以找到doc here

主题 VS @Output

Subject使用数据驱动的方法。@Output使用事件驱动的方法,或者更好的方法反应式编程方法

所以与此同时@Output当您想要传达事件已发生时的首选方式,Subject是传达数据已更改的首选方法。

主题既是可观察值的来源,又是可观察的对象 本身。您可以像订阅任何 Observable 一样订阅主题。

这意味着您可以使用Subject观察特定变量或值(Subject as Observer),它检测观察值的变化并发出某种事件。

与此同时,你可以有许多其他观察者正在观察Subject (Subject as Observable)通过订阅主题的事件。

当对象观测值发生变化时,所有对象的订阅者都会收到通知。

票务应用程序就是一个例子。一个用户加载负责显示空闲剩余位置的组件。他正在考虑选择哪个地方。与此同时,另一个用户买了票,所以他的位置现在不可用。第一个用户现在应该看到该位置不可用,因此您需要刷新数据,要求他们使用远程服务(可能使用轮询算法)。当检索新数据时,您将新数据传递到Subject.next(). Subject检测到观察到的值发生了变化,并通知他的所有订阅者该值发生了变化。明显地Subject将新数据传递给订阅者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 中的子父母沟通最佳实践 的相关文章

随机推荐

  • 如何在 Ruby 中进行高级字符串比较?

    我正在尝试比较两段字符串 其输出必须是相似度的百分比 我尝试过使用diff方法和一些Natural Language Processing tools 在红宝石中是否有更好的方法来做到这一点 您可能想为此尝试 Levenshtein 字符串
  • R 使用 lapply 保存绘图

    我有一个名为的模型对象列表allAR1 对于每个模型对象 我需要使用tsdiag函数生成诊断图 然后将该图保存到文件夹中 我正在尝试使用 jpeg lapply 和 dev off 的组合来应用tsdiag每个模型 然后将生成的图保存为图像
  • JNA:找不到指定的程序

    我试图了解 JNA 的工作原理 因此我决定使用 spotify API libspotify 0 0 7 我设法正确加载我的 dll 但看起来我的代码没有找到 API 中定义的任何方法 这是我的代码 我的主要文件 public class
  • 组菜单项可以工作,但不显示复选标记

    我有一个带有溢出菜单的工作应用程序 菜单中的所有代码都有效 但在我单击可单击的分组菜单项后 没有显示复选标记 我是否在做一些根本性错误的事情 我认为 Android 系统会自动显示复选标记 并且系统会为我执行此操作 Android知道它是在
  • 如何指示两种 Coq 电感类型尺寸的减小

    我正在尝试定义game组合游戏的归纳型 我想要一个比较方法来判断两个游戏是否相同lessOrEq greatOrEq lessOrConf or greatOrConf 然后我可以检查两个游戏是否相等 如果它们都是 lessOrEq and
  • 为什么 SwiftUI Image 添加额外的填充来封闭 VStack?

    我正在努力解决一个非常简单的问题 如果我将一个文本放入 VStack 则顶部没有填充 如果我现在放置一个图像 我就会有一个填充 请看下面的截图 对应的代码是 struct NewView View var body some View VS
  • 不进行舍入的十进制格式.net

    昨天我问了这个一般性问题关于小数及其内部精度 这是一个关于我试图解决的场景的具体问题 我在 Sql Server 中有一个列 输入为十进制 18 6 当我获取这些值时 创建的 net 小数与数据库中的精度匹配 它们看起来像这样 1 1000
  • VB.Net 替换不起作用?

    不确定我是否做错了什么 基本上我的代码从 111111111 开始 并通过每次线程能够时将 1 添加到原始数字来进行计数 我希望该方法跳过序列中的 0 而不是在 111111119 之后转到 111111120 我希望它直接转到 11111
  • 如何就地对文件进行排序?

    当我们使用sort file命令 该文件以排序的方式显示其内容 如果我不想在标准输出上获得任何输出 而是想在输入文件中获得任何输出 该怎么办 您可以使用 o output FILEsort 选项指示相同的输入和输出文件 sort o fil
  • 将对象数据字段复制到子类实例中

    我有两个类 TNode 和 TMaster 我从 TNode 继承了 TMaster 目标是创建一个 TMaster 实例 其中包含先前创建的 TNode 实例的所有数据 是否有任何 内置 方法可以实现此目的 或者应该手动完成 type T
  • 计算向量中相同字符串的更简单方法?

    我正在尝试获取向量中所有相同字符串的数量的输出 作为更大程序的一部分 经过大量研究后 我设法将一些有用的东西组合在一起 但看起来很混乱 我想知道是否有更好的方法来做到这一点 include
  • 在多行数据中提取记事本++中2个特定单词之间的字符串/数据

    All 我一直在尝试使用正则表达式搜索和替换在 Notepad 中提取 2 个特定单词之间的文本 但没有运气 它给了我找到的最后一个匹配项 我尝试搜索 Stack Overflow 并回答了几个问题 但没有运气 我的数据是 Open opt
  • FirebaseListAdapter 不推送聊天应用程序的单个项目 - Firebase-Ui 3.1

    我正在 Android 上制作一个聊天应用程序 它使用 google firebase 来存储用户互相写入的消息 为了向用户显示这些消息 我从数据库中读取它们 并使用 ListAdapter 将它们组织到自定义 ListView 中 在我将
  • 如何在Jcreator中调试? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我使用的是 JCreator 版本 5 0 0 10 而且我不知道如何调试程序 能否请您
  • 根据文本内容查找html元素

    我有一个像这样的html代码 div span TV span div 我想找到这个span通过具有文本 TV 的 documentObject 例如getElementById等等 类似的东西getElementByText 我知道可以通
  • 在 C# 中指定范围

    我有 6 个范围 1000000 5000000 50000001 10000000 10000001 25000000 25000001 50000000 50000001 75000000 75000001 100000000 现在我该
  • h5py 将虚拟数据集读取到 NumPy 数组时出错

    我正在尝试从使用 h5py 创建的虚拟 HDF 数据集加载数据 但在正确加载数据时遇到一些问题 这是我的问题的一个例子 import h5py import tools as ut virtual h5py File ut params p
  • C# 泛型方法和动态类型问题[重复]

    这个问题在这里已经有答案了 我有一个通用方法声明如下 public void Duplicate
  • SurfaceView 和 ImageView 的区别

    我想知道SurfaceView和ImageView有什么区别以及它们的使用场景 两者似乎都是一样的 如果有我可能错过的正确链接 请指导我 表面视图的一些优点和差异 更好的渲染机制 线程可以在不使用处理程序的情况下更新表面的内容 这有助于提高
  • Angular 中的子父母沟通最佳实践

    我正在努力提高 Angular 的水平 并且想了解儿童与家长之间沟通的最佳实践 我当前想要使用的应用程序是 Angular 6 我知道我可以使用 ViewChild Output 或创建服务在子父组件之间进行通信 还有其他方式进行沟通吗 如