- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在深入研究双向数据绑定(bind)的工作原理。我目前对来自 View (例如,input
元素)的更新如何在内部传播到 NgControl
感到困惑。
在 ControlValueAccessor
的定义中,它提到 registerOnChange
负责 View -> 模型更新( docs where they say it 和 src )。使用一个简单的指令,我们可以将其放在与 input
相同的 [(NgModel)]
元素上,例如<input [(NgModel)]=stuff myInspectorDirective>
,我试着玩这个。
constructor(private ngControl: NgControl) { }
ngOnInit(): void {
// this.ngControl.valueAccessor['onChange'] = () => {};
// uncommenting the above line prevents updates from view to model
}
取消注释/注释指示的行允许我们允许/阻止从输入元素到模型的更新。但我对此感到困惑,因为在本例中使用的 DefaultValueAccessor 的源代码中, onChange
并没有真正做任何事情:(_:any) => {}
。
所以,我希望在引擎盖下,例如在 ng_model.ts 或相关类之一中,如 NgControl
或 FormControl
,ValueAccessor 的 onChange
函数发生了一些事情;设置它或将其包装在另一个函数中,可能是代理或其他任何东西。我没有找到任何东西。然后我继续寻找一些代码,其中监听器(对于 input
事件,更明确地说)明确绑定(bind)到输入元素,但也没有运气。
我注意到 OnChanges
function calls _setValue
,但我不确定在深入了解变化检测的内部时我是否朝着正确的方向前进,因为我希望监听 DOM 中的变化与 ControlValueAccessors
和/或FormControl/AbstractControl
有人想详细说明它是如何工作的吗? :-)
最佳答案
ControlValueAccessor.registerOnChange 由 NgForm 提供。
1) NgModel 在 NgForm 中注册(参见 https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_model.ts )
in NgModel.ngOnChanges: this._setUpControl calls this.formDirective.addControl
2) NgForm 调用共享的 setUpControl 函数(参见 https://github.com/angular/angular/blob/master/packages/forms/src/directives/ng_form.ts )
import { setUpControl } from './shared';
NgForm.addControl calls setUpControl
3) setUpControl 注册更改事件处理程序(参见 https://github.com/angular/angular/blob/master/packages/forms/src/directives/shared.ts )
setUpControl calls setUpViewChangePipeline
function setUpViewChangePipeline(control: FormControl, dir: NgControl): void {
dir.valueAccessor !.registerOnChange((newValue: any) => {
control._pendingValue = newValue;
control._pendingChange = true;
control._pendingDirty = true;
if (control.updateOn === 'change') updateControl(control, dir);
});
}
关于javascript - Angular2+ : how does NgModel/NgControl internally handle updates from view to model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51999631/
事情是这样的: {{something}} 出于某种原因,我无法访问另一个 Controller 的 div 中的 controller1.Data.someId,但我
出于各种原因,我有几个包装 PrimeNG 组件的自定义组件。我的组件的一些实例以 react 形式使用,并且字段的“要求”是使用 Validators.required 验证器设置的。 PrimeN
我正在尝试在自定义组件上使用 ngControl。我已经创建了组件并在组件上实现了 ControlValueAccessor。 然后在构造函数中,注入(inject) NgControl 如下: co
我有一个 angularJS 应用程序的工作实现,它从 URL 中获取一些链接并绘制它们。然而,URL 上的链接会不断更新,我想定期更新此 $scope.liSTLinks,假设每 10 秒更新一次。
在我的 Angular 应用程序中,我有一个动态更改输入组件的表单。所有动态组件都是 ControlValueAccessor 的实现。 如果您在 Input 中输入值,然后更改组件(单击“将组件更改
一旦我导入 FormsModule,我就会开始收到此错误。我正在使用 MatFormField,但它似乎不能与 FormsModule 一起使用。 最佳答案 我刚刚用与您相同的错误消息解决了我的问题。
我有以下内容(https://jsfiddle.net/hhgqup4f/5/): Parent Controller 是: app.controller("Controller", Con
这是一个骗子:http://plnkr.co/edit/F6QM4KUU8DPNq6muInGS?p=preview 使用 ng-include 包含 html 文件,并在同一标记中设置 ng-con
我在理解如何使用 ng-controller 时遇到了一些困难。我在 eventController.js 中有一个表单 Controller 。 My Event:{{event.na
我想知道这两种创建 Controller 的用例是什么: 使用 ngController: myApp.controller('myController', ['$scope', function (
如何使用 ngControl在 contenteditable元素?例如,我想要: 通过绑定(bind)(?)将其绑定(bind)到模型驱动的“表单”(表格)。我用 formBuilder 创建了
如何从单元测试中访问注入(inject)的 ngControl?如何解决错误? 在组件中 constructor( @Self() @Optional() public ngControl:
我正在尝试创建自定义 angular 2 验证器指令,它像这样注入(inject) NgControl: @Directive({ selector: '[ngModel][customValid
我有以下 Angular 2 形式: {{'FIRST_NAME_FORM.MIN_
在 Angular 2 形式中,尝试通过 ngSubmit 获取数据。我可以毫无问题地在我的表单组件中分配 ngModel 和 ngControl 属性,但是在子组件 MyInput 中,我无法在没有
我很难尝试在表单中同时使用 *ngIf 和 ngFormModel 来验证所述表单。 用例是这样的:根据用户输入,隐藏或停用表单中的某些特定字段。但如果显示这些输入,则必须对其进行验证。 当只需要基本
在我的应用程序中,我想保留对某些代码部分使用普通 Controller 的选项 - 而不是为永远不会重复使用的一次性事物创建指令。 在这些情况下,我经常想从 Controller 发布一些数据以在包含
我正在构建一个自定义组件,它实现了 ControlValueAccessor,因此我可以在我的 from.xml 中将其与 ngControl 和 ngModel 一起使用。现在我想要逻辑来验证组件是
我正在构建一个自定义组件,它实现了 ControlValueAccessor,因此我可以在我的 from.xml 中将其与 ngControl 和 ngModel 一起使用。现在我想要逻辑来验证组件是
我正在尝试按照 Kara Erickson 在上一个 Angular Connect 上推荐的方式实现自定义 ControlValueAccessor https://youtu.be/CD_t3m2
我是一名优秀的程序员,十分优秀!