Angular 4自带的form element组件

2024-01-18

我是角度初学者,我可能需要一些帮助。首先,我将展示它如何工作,然后我将写下我希望它如何工作。

这是使用 ngModel 时的常规方式:

    <form>
      <input name="name" placeholder="name" [(ngModel)]="model.name" value="" />
      <select name="select" [(ngModel)]="model.select">
         <option value="1">..</option>
         ...
      </select>
      <input type="button" value=" click me" />
    </form>

如果您不希望选择有自己的外观,这已经足够了。我的目标是为此创建一个组件,我可以在其中创建 div 和其他内容,我可以设计这些内容以适应此表单元素的未来显示。另一方面,我想保持 ngModel 的舒适性。因此,在我的目标中,模板应该如下所示:

    <form>
      <input name="name" placeholder="name" [(ngModel)]="model.name" value="" />
      <app-select label="label" name="select" [placeholder]="'placeholder'" [(ngModel)]="select" [options]="options"></app-select >
      <input type="button" value=" click me" />
    </form>

我已经尝试创建类似的东西,但遗憾的是我失败了:( 请问有比我更有经验的人可以帮我解决这个问题吗? 提前感谢您的时间和答复!

如果有必要,我可以在这里重新创建一些最小的东西:https://stackblitz.com/ https://stackblitz.com/


以下是我如何在表单中执行此操作(请记住,我使用的是带有表单生成器的反应式表单,而不是带有 ngModel 的模板驱动表单):

First,我在名为的目录中创建一个自定义 FormModuleforms.

Next,里面有各种表单组件。让我们使用LoginFormComponent例如。

这里是LoginFormComponent:

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

@Component({
    selector: 'login-form',
    templateUrl: './login-form.component.html'
})
export class LoginFormComponent implements OnInit {
    @Output() onChange: EventEmitter<FormGroup> = new EventEmitter();

    form: FormGroup;

    constructor(private fb: FormBuilder) {
        this.form = this.fb.group({
            email: [null, Validators.email],
            password: [null, [Validators.required, Validators.minLength(6), Validators.maxLength(60)]]
        });

        this.form.valueChanges.subscribe(() => this.onChange.emit(this.form));
    }

    ngOnInit() {
        this.onChange.emit(this.form);
    }
}

这是 HTML:

<form autocomplete="off" [formGroup]="form">
    <div class="form-group">
        <label for="username">Email *</label>
        <input type="text" id="username" class="form-control" placeholder="Enter your email address" formControlName="email" autofocus>
        <control-messages [control]="form.get('email')"></control-messages>
    </div>

    <label for="password">Password *</label>
    <input type="password" id="password" class="form-control" placeholder="Enter your password" formControlName="password">
    <control-messages [control]="form.get('password')" [label]="'Password'"></control-messages>
</form>

现在在导入模块内的任何自定义组件中FormModule,我可以执行以下操作:

应用程序组件.html:

<login-form (onChange)="form = $event"></login-form>

<button (click)="submit()">Submit</button>

应用程序组件.ts:

@Component({...})
export class AppComponent {
    form: FormGroup;

    submit() {
        // Do something with `this.form`.
    }
}

这种设计的好处可能不会立即显现出来,但它使我们能够做一些事情:

  1. 首先,我们可以重用login-form只要我们导入我们的自定义组件,就可以在我们应用程序的任何位置FormModule。如果我们更改它,它会在各处自动更新。保持事物干燥。
  2. 接下来,我们可能不希望每个地方都有相同的提交按钮/文本,并且我们可能希望它在不同的位置执行不同的操作,因此login-form组件仅包含表单本身,任何提交逻辑都在其外部处理以实现重用。当您拥有用于创建和编辑的表单时,这一点很重要。编辑按钮可以保存数据,而创建按钮可以创建新内容。如果将提交按钮放在表单组件内,则这种重用并不容易实现。

对于稍微复杂的表单,比如说可以接受一些默认值的表单,请看一下这个示例TagFormComponent:

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

import { Tag } from 'shared';

@Component({
    selector: 'tag-form',
    templateUrl: './tag-form.component.html'
})
export class TagFormComponent implements OnInit {
    @Output() onChange: EventEmitter<FormGroup> = new EventEmitter();

    form: FormGroup;

    constructor(private fb: FormBuilder) {
        this.form = this.fb.group({
            name: [null, Validators.email]
        });

        this.form.valueChanges.subscribe(() => {
            this.onChange.emit(this.form);
        });
    }

    @Input()
    set tag(tag: Tag) {
        if (tag) {
            this.form.patchValue(tag);
        }
    }

    ngOnInit() {
        this.onChange.emit(this.form);
    }
}

这遵循与LoginFormComponent,除了这个可以传递表单的一些默认值。像这样:

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

Angular 4自带的form element组件 的相关文章

  • 角度 - 传递管道作为变量

    如何存储和使用变量中的管道信息 我已经搜索了很多 但找不到解决方案 我想要实现的是将任何有效的管道信息作为变量 小数 百分比 日期 自定义等 传递 下面是一个简单的例子 父组件 ts columnsDef value 0 35 pipeIn
  • 角度 2 中的动态 styleUrls?

    是否可以将样式表的 url 动态注入到组件中 就像是 styleUrls stylesheet1 css this additionalUrls 或者 一厢情愿并注意这只是假代码 export class MyComponent imple
  • Angular - Angular Material 2 步进器控件

    我使用 Angular Material 2 步进器设置了一个线性步进器 我有不同组件 组件a 组件b 组件c 中的表单 在我的主容器组件 容器组件 中 我希望有一个线性步进器 当它们的形式有效时 它可以 步进 通过每个组件 是否有某种功能
  • npm 错误!遵循 Angular 2 快速入门时出现无效名称:“@angular/core”

    我正在尝试遵循Angular 2 快速入门 https angular io docs ts latest quickstart html 第一步是设置环境 我对 npm 并不是完全陌生 我设法安装并尝试了 Ember 但仅此而已 下面是我
  • 如何在 Ionic 2 中动态创建具有特定类的模式?

    嗨 我已经被一个问题困扰好几天了 到目前为止还没有研究证明足够 我正在尝试在 Ionic 2 中创建一个具有特定类 或 id 的简单模式 我需要这样简单的东西
  • 如何禁用 Angular 2 中的复选框

    我想禁用复选框输入 我的意思是 用户无法选中复选框 有一个属性可以禁用它吗 例如 启用 或 禁用 或者我该如何解决这个问题
  • 由 aws API 制作的 HttpRequest 拦截器

    我正在开发一个项目 该项目使用 cognito 作为身份验证服务来保护使用 nodeJS 制作的无服务器休息 API 我已成功关闭未经身份验证的客户端的 API 现在 每当我从 Angular 客户端发出请求时 我都需要在标头中自动注入一个
  • 角度编译速度慢

    我有一个API in Symfony PHP 我用它来测试postman它就像一个魅力 但当我这样做时ng serve aot optimization应用程序开始构建并且消息compiled successfully 需要一分多钟 当我需
  • Jasmine 测试中的模板解析错误,但实际应用程序中没有错误

    我开发了 Jasmine 规范来测试 Angular 2 组件MiddleRowComponent 当我运行 jasmine 测试时 出现以下错误 zone js 388 Unhandled Promise rejection Templa
  • Ionic 2 RC0 和 Angular 2 最新的 Android 构建错误(ngc:错误:静态解析符号值时遇到错误)

    当我使用构建android时出现错误ionic build android命令 ngc 错误 静态解析符号值时遇到错误 引用本地 非导出 符号 字典 考虑导出符号 原始 ts文件中的位置14 8 解析符号TRANSLATION PROVID
  • JS文件中的System.register是什么意思?

    在 Angular 2 中使用指令时 JS 文件中的 System register 是什么意思 我认为这个问题并不特定于 Angular2 中的指令 它是关于 ES6 TypeScript 和其他使用 SystemJS 的现代编译器的一般
  • 如何对使用 router.paramMap 的 Angular 4 组件进行单元测试

    我是 Angular 4 的新手 并尝试从单元测试中测试 Angular 4 功能 router paramMap 之一 以以下方式读取路由参数并在我的应用程序中按预期工作 constructor private router Router
  • 如何在 Nrwl Nx 中集成 firebase

    我真的很想将 firebase 以及 firebase cli 集成到 Nx 中的应用程序中 但不知道如何实现 我使用 firebase 函数 托管 cli tools 等 理想情况下 我希望能够使用 firebase cli 部署用于托管
  • Angular 4:在订阅中收到错误消息

    在服务中 有这样的代码 getUser id return this http get http id map res gt res json 在组件中 this myService getUser this id subscribe cu
  • 关注新添加的输入元素

    我有一个新的 Angular 2 应用程序 其中包含以下列表input盒子 当用户按下返回键时 我添加一个新的input紧接着他们当前正在编辑的框后面的框 或者更确切地说 我 异步 向模型中的数组添加一个新条目 这会导致 Angular 2
  • Angular:扩展服务和传递参数

    我很难理解如何在 Angular 中扩展服务 我有一个连接到 Firebase 并执行各种常见任务 获取 设置 更新 列表等 的服务 我没有为我的特殊组件重写它 而是尝试扩展它 我的想法是我可以只传递路径的新部分 但这会引发错误 Canno
  • Angular2:禁用表单构建器的元素

    我试图在声明后禁用表单构建器的一个元素 因为加载视图后我必须验证某些内容 所以这是我的表单构建器声明 ionViewDidLoad this purchaseDataForm this formBuilder group kms Valid
  • Angular2 - 防止复选框被选中

    我有一个每行包含一个复选框的表 在表头中 我有一个Check All切换所有表格行框的复选框 我正在尝试实现一些逻辑 如果复选框的数量将超过特定限制 则显示错误并且不切换表行复选框或checkall盒子本身 有一个问题允许checkAll即
  • 在 Angular 6 中添加 Xsrf-Token 时出现问题

    通过 API 提交的表单中的数据已成功发布 但是将 X CSRF TOKEN 添加到标头并设置后withCredentials true结果数据未发布到名为的脚本insert php Error 加载失败http localhost sim
  • Angular Service Worker - 无法加载资源:服务器响应状态为 504(网关超时)

    我正在使用Angular CLI 1 6 6 and angular service worker 5 2 5 in our Angular 5 2 5应用程序 除了在我们的生产环境中弹出一条错误消息之外 本地精简版服务器以及生产服务器上的

随机推荐

  • 释放 std::vector 对象的“正确”方法

    第一个解决方案是 std vector
  • js - “间接”调用方法时“this”未定义

    我的目标是从函数表中调用函数来概括命令处理 即间接 很遗憾 this isundefined当这样称呼时 function Server this sessions server this this handlers dummy serve
  • using 块中实例化的所有一次性对象是否都已处理?

    这是我过去多次问自己的问题 因为我使用 5 层深度的语句进行嵌套 正在阅读docs http msdn microsoft com en us library yh598w02 aspx并没有发现任何提及other在块内实例化的一次性物品我
  • xunit 构造函数在每次测试之前运行

    我有一个测试类 在每次测试执行之前都会调用构造函数 目前 以下测试之间不共享构造函数初始化的数据 我希望初始化数据设置一次并在所有测试中共享 这是我的代码 Category Basics Collection DBCollection Ex
  • 从通知启动应用程序将其从最近的应用程序历史记录中删除

    当我从通知启动其中一个应用程序时 我遇到了问题 它永远不会出现在 最近使用的应用程序 列表中 如果没有通知 一切都会按预期进行 我启动应用程序 导航到并退出它 使用主页按钮或后退按钮 之后我可以长按主页按钮返回到它 gt 确定 当我收到通知
  • Proguard 不会混淆 gui 组件

    我想使用 ProGuard 来混淆我的 Android 应用程序 这很好用 但我的 gui 类 扩展了 Activity View 和 SherlockActivity 并没有被混淆 这是 proguard cfg injars bin c
  • Yii2:如何访问模板邮件中的参数?

    我有以下代码 Yii app gt mailer gt compose layouts html name gt this gt name email gt this gt email subject gt this gt subject
  • 防止调试 PhoneGap 应用程序

    我使用 PhoneGap 创建了一个 iOS 应用程序 我了解到将 iPhone 连接到 Mac 在 iPhone 上启用 Safari 调试 然后在 Mac 上使用 Safari 来查看属于该应用程序的所有 HTML 和 JavaScri
  • 如何在 iOS 中从图像处理中检测对象?

    我有一个图像 图像中有一个玻璃杯 两个勺子 此图像显示在 iPad 上 现在我希望当用户仅触摸勺子时 勺子颜色将变为绿色 图像的其余部分保持不变 我不知道该怎么做 从哪里开始呢 任何想法或建议都将受到高度欢迎 使用 CALayer 使用所需
  • 习惯从类型继承元类?

    我一直在尝试理解 python 元类 因此一直在浏览一些示例代码 据我了解 Python 元类可以是任何可调用的 所以 我可以让我的元类像 def metacls clsName bases atts return type clsName
  • 使用 PadRight 方法填充字符串

    我正在尝试在 C 中的字符串末尾添加空格 Trip Name1 PadRight 20 还尝试过 Trip Name1 PadRight 20 这些似乎都不起作用 不过我可以用任何其他字符填充字符串 为什么 我应该更具体 这是完整的代码 l
  • 在 Laravel 5 中动态编辑 .env 是个好主意吗?

    我正在构建一个管理面板 所以我需要做一些核心设置我的 Laravel 5 应用程序 如 smtp 设置等 可通过前端界面配置给最终用户 我最初的想法是使用数据库作为设置存储和缓存 以避免每次访问配置值时发出数据库调用 然而 看来 外观在配置
  • 在摘要报告侦听器文件名中使用时间函数

    在 JMeter 5 1 1 中 我有一个摘要报告 我试图将其保存为带时间戳的文件 文件名值如下所示 D Load Tests example com Results time yyyy MM dd HH mm ss summary csv
  • 在类 Unix 系统上获得以秒或毫秒为单位的正常运行时间

    我需要一种方法 可以给出自系统启动以来经过的毫秒数或秒数 我可以解析 proc uptime 但我不能因为这个 I 0 和解析而损失性能 我正在使用 Linux 和 C C 也许我可以添加一些 Qt Boost 但最好是原生的 为什么你读不
  • Entity Framework 4 与 LINQ to SQL,适用于中小型应用程序,与 SQL Server 配合使用

    早在 4 月份 VS2010 发布时 我就在 Stack Overflow 上看到过一些关于 L2S 与 EF4 的讨论 即 既然 Entity Framework 4 0 已经发布 就转储 Linq To Sql 吗 https stac
  • 尝试在 Flutter 上运行此处示例时出错

    所以我正在尝试将 Here 集成到我的 flutter 应用程序中 所以我正在关注这个页面flutter sdk 导航 https developer here com documentation flutter sdk navigate
  • 更新到 Mac OSX 10.9.4 后找不到 npm 命令

    将操作系统更新到 Mavericks 后 我无法在终端上执行 npm 命令 当我尝试这个时 node usr local lib node modules npm bin npm cli js v它正在工作并显示版本 1 4 3 我不知道这
  • Flash 功能中的冲突检测? (命中测试对象)

    你好 所以我最近一直在使用hitTestObject检测我正在制作的 Android 应用程序中的碰撞 经过一番测试后 我意识到游戏正在检测 假 碰撞 我的意思是它正在检测碰撞not当物体的像素接触时 但是 经过一些研究后 我发现boxes
  • 如何让每个
  • 标签一个接一个地慢慢出现
  • 我希望当页面加载时列表项慢慢地一个接一个地出现在屏幕上 这是jquery中的代码 我使用过show 但它不起作用 我确实在这里查找问题 其中一些正在使用附加方法 但这不是我要寻找的 html ul li A li li B li li C
  • Angular 4自带的form element组件

    我是角度初学者 我可能需要一些帮助 首先 我将展示它如何工作 然后我将写下我希望它如何工作 这是使用 ngModel 时的常规方式