- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在我的 Angular (4 + Typescript) 项目中,我使用了已经准备好的组件(这并不重要,因为扩展 ControlValueAccessor 的方式是相同的,但如果这很重要,我使用了 ng2-select),因为更好用户体验和更好的外观。在将它包含到我看到的使用响应式(Reactive)表单的表单组件中之后,在提交时我返回(用于表单控件)基于类 SelectItem 的对象,该类在准备好的组件中使用,以管理选定的项目 - 如下所示:
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: SelectItem { // <--
id: '1',
text: 'Chosen item'
}
}
因为该组件基本上只是标准选择控件的替代品,所以我期望我会取回以字符串形式形成的所选项目的 ID - 如下所示:
// console.log(this.myForm.values)
Object {
txtInput: 'value',
// ...
preparedComponent: '1' // <--
}
在了解了 ControlValueAccessor 的实际含义及其工作原理之后,我将提交时返回的内容(或者更确切地说是项目更改时返回的方式 - onChange
)更改为项目的 ID。问题解决了一段时间,直到我开始设置预定义值(在编辑实例上)以形成控件而不是空值(在添加实例上)。我发现这次 writeValue
正在根据作为预定义值发送给它的内容来分配值以形成控件。因此,如果我将预定义值发送为 ...
Object {
id: '1',
text: 'Chosen item'
}
...这也是 Object on submit 中的值,就像上面的第一个代码示例一样。我为此做了一个解决方法,在调用 writeValue
后立即使用 onChange
分配正确的值来控制。这确实是不正确的做法,但我想不出除此之外的任何事情:
public writeValue(val: any): void {
this.selectedItems = val; // val is for example Object { id: '1', text: 'Chosen item' }
setTimeout(() => {
this.onChange(val.id); // just an example of emitted value, there should be some checks val is object and id exists in real code
}, 0);
}
就我没有开始订阅表单控件的 valueChanges
而言,这也有效。问题在于,每次为准备好的组件分配预定义值时,即使使用 { emitEvent: false }
,提交后也会发出使用的值,返回给订阅者。
所以这就是我想用准备好的组件以某种方式处理的事情,因为我想在提交时从控件中获得正确的值,并且我不希望在值真的没有改变之前向订阅者发出更改,而不仅仅是被替换作为预定义值。任何想法如何处理这将不胜感激。
最佳答案
我不确定我是否理解正确,但我想试一试。
您希望组件的输入为以下类型:
{
id: string,
text: string
}
但是您希望组件的输出 只是所选项目的字符串 ID。
我认为这个数据流有点尴尬。 During initialization, preparedComponent
is an object
, but when an item is selected you want to turn it into a string
.除了类型安全问题之外,它感觉不直观。
为了比较,想象一下使用 ngModel
和文本输入来执行此操作:
<input type="text" [(ngModel)]="preparedComponent" />
您是否希望传入一个对象,并在用户键入时返回一个字符串?可能不是。
但是让我们假设由于某种原因它一定是这样的。您通过修改 ng2-select
对 ControlValueAccessor
的实现,或者创建您自己的组件来实现 ControlValueAccessor
并包装 ng2-选择
。 (我不知道你在你的问题中做了哪些)。现在您在选择一个项目时调用 this.onChange(val.id)
,这会使用字符串 ID 更新父组件。
然后您注意到一个单独的问题,即如果您预定义了一个选定值,ng2-select
会在初始化期间触发一个更改事件。这很奇怪,因为用户还没有与选择控件交互。因此,您尝试通过使用 emitEvent: false
在表单控件上调用 setValue
来初始化 preparedComponent
,但我猜这是行不通的,因为虽然它可能在您初始化数据时阻止了更改事件的发生,ng2-select
立即对您的数据进行了第二次更改。
因此,您通过等到 ng2-select
的第一次更新将父组件更新为新对象来解决此问题,然后(使用 setTimeout
)您用你真正想要的字符串 ID 覆盖它。这使 preparedComponent
与字符串保持同步,但并没有解决更改事件触发的问题,即使用户没有与控件交互也是如此。 (顺便说一句,如果你用自己的组件包装 ng2-select
那么我不确定你为什么必须做这个 setTimeout
部分,因为不会正如我在上一段中提到的,当 ng2-select
通知您一个新的选定项目时,您是否已经有另一个调用 this.onChange(val.id)
的函数? )
因为我不知道你是直接修改ng2-select
,还是用你自己的组件包装它:
如果您正在修改 ng2-select
,为什么不直接找到它的 writeValue
方法并删除发出事件的代码?这样它会在您预定义一个值时更新 DOM,但不会覆盖您的值。
如果你用你自己的组件包装 ng2-select
,为什么不修改你的 writeValue
方法来存储一个标志 if ng2-select
即将触发一个事件,因此您可以忽略它:
private: ignoreSelectedEvent = false;
public writeValue(val: any): void {
this.ignoreSelectedEvent = true;
// Update ng2-select, which will cause an event to fire
}
然后在您对新选择的项目使用react的函数中:
if (this.ignoreSelectedEvent) {
this.ignoreSelectedEvent = false;
return;
}
// Update the model with the string ID
this.onChange(val.id);
关于javascript - 提交和值更改事件上的 Angular 4 ControlValueAccessor 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43515028/
我正在尝试在项目中学习和添加 Angular 国际化。我只能理解 Angular 文档 (https://angular.io/guide/i18n-overview) 的编译时翻译。 我需要这样的东
在我的 Angular 应用程序中,基于登录用户,我想通过显示/隐藏不同的菜单项或允许/禁止某些路由来授予或限制功能。 目前成功登录后,我的 .NET Core API 会返回一个 JWT token
我是 Angular 的新手,目前我已经看过 angular.io 网站提供的一些示例。但是在component decorator在文档中的解释,它指出 Angular components are
这里是service employee-service.service.ts的代码 import { Injectable } from '@angular/core'; import { HttpC
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
我目前正在使用@angular/http URLSearchParams 类来检索 URL 参数。在 Angular 5 中,注意到这已被弃用,但我没有看到以我当前使用的方式替换 URLSearchP
如何正确安装 PUG/JADE 到 Angular 2 或更高版本 这样在工作和 AOT 和 JiT 的同时 工作单元和集成测试 并且在创建每个新组件时不会受到太多影响 最佳答案 我看到了很多解决方案
我的 Angular 12 应用程序中有一些通用组件,我计划将其创建为一个 Angular 库,以便其他应用程序也可以使用它。我们有一些应用程序在较低版本的 angular(例如 angular 8/
tl;dr; ng build 删除了包含我编译的自定义库的/dist 文件夹。这会使我项目代码中对该库的所有引用无效,从而导致 ng build 最终失败。我做错了什么? 我关注了documenta
我正在将一些“遗留”(非 typescript )js 库导入到我的 Angular SPA 中。 通常我只是从 cdn 添加一个负载到 index.html 就像: 在 Angular 分量中我只
我有这个 angular 应用程序,它基本上使用了库的概念。 我有 2 个名为 的库Lib1 和 lib2 根据他们所服务的微服务分组。 现在我将这些库导入主应用程序,即 应用1 事情一直到现在。 现
我在我的项目中启用了 angular Universal。我现在想完全删除它。我试图删除以下文件 /server.ts /webpack.server.config.js /src/tsconfig.
我已经有一个 AuthService 在登录时对用户进行身份验证,并且 AuthGuard 在未登录的情况下阻止访问。 某些页面我通过 UserProfile/Role 限制访问,但现在我需要阻止页面
我正在尝试使用 angular、TypeORM、SQLite 和其他组件作为 webpack 构建 Electron 应用程序。 我从在 GitHub 上找到的示例开始我的开发:https://git
我在从 Angular 8 更新到 9 并运行时遇到以下错误 ng 更新@angular/material: Package "@angular/flex-layout" has an incompa
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在尝试使用 Angular 9,我想创建一个项目,然后创建一个库项目并开始向其中添加我想稍后在 GitHub 上发布的通用模块,并在我的本地使用这些库项目。 相关依赖如下: Angular CLI
我正在我的 h1 元素“之前”创建一个小的程式化三 Angular 形图案,但我无法正确地圆 Angular 。右上角没问题,但其他两个有剪裁问题。 这是输出以及形状的放大图像: 使用的代码如下: h
我有一个 Angular 元素,带有自定义标记名 - fancy-button。如何将 fancy-button 嵌入 Angular 应用程序? 我已经尝试了以下方法,但都没有用 - 在 index
我已将我的项目从 angular 5.2.9 升级到 angular 6.0.0-rc.5。 除了包路径中的几个快速 RxJS 修复外,一切看起来都不错。(此链接非常有用:Want to upgrad
我是一名优秀的程序员,十分优秀!