委托从Angular 2组件到嵌套元素的绑定
这些绑定非常有效:委托从Angular 2组件到嵌套元素的绑定,angular,checkbox,components,custom-controls,Angular,Checkbox,Components,Custom Controls,这些绑定非常有效: <input type="checkbox" (click)="foo.bar()" [(ngModel)]="foo.baz"> 但是如何将这些绑定委托给组件内部的输入 <custom-checkbox>Check me!</custom-checkbox> 检查我! …下面是“custom checkbox.component.html”: 我已经使用Angular 1好几年了,但本周才开始使用Angular 2。我读过很
<input type="checkbox" (click)="foo.bar()" [(ngModel)]="foo.baz">
但是如何将这些绑定委托给组件内部的输入
<custom-checkbox>Check me!</custom-checkbox>
检查我!
…下面是“custom checkbox.component.html”:
我已经使用Angular 1好几年了,但本周才开始使用Angular 2。我读过很多文章,比如Angular docs,其他一些类似的堆栈溢出问题,以及Angular 2上使用的问题,但我仍然不明白他们是如何做到这一点的。看起来应该更直截了当些
这是我需要制作的许多自定义UI元素之一,因此我希望这个示例能够帮助我理解我所缺少的原理和实现
我知道我可以使用一个带有选择器的输入复选框,并将其包装起来,但我希望保持原样干净
我基本上是在做和他们一样的事情(棱角2材质),但是有我们自己的风格,而且比他们提供的所有选项都简单得多。就像他们说的,
提供与本机相同的功能,并通过材质设计样式和动画增强
这就是我要做的。虽然Angular 1的链接功能似乎使整个过程更容易,但本文似乎通过一个很好的示例,向我展示了Angular 2材质通过内置接口使用的勇气: 这允许开发团队通过直接绑定到组件,但将绑定转发到我的模板中的复选框(或其他表单元素)来使用我的组件 如果链接中断,为了方便和文档持久性,请从站点引用: 因此,不用多说,这里是我们的组件: 从“@angular/core”导入{Component,forwardRef}; 从“@angular/forms”导入{NG_VALUE_访问器,ControlValueAccessor}; 常量noop=()=>{ }; 导出常量自定义\输入\控制\值\访问器:任意={ 提供:NG_值访问器, useExisting:forwardRef(()=>CustomInputComponent), 多:真的 }; @组成部分({ 选择器:“自定义输入”, 模板:` `, 提供者:[自定义\输入\控制\值\访问器] }) 导出类CustomInputComponent实现ControlValueAccessor{ //内部数据模型 私有内部值:any=''; //稍后提供的回调的占位符d //通过控制值访问器 私有onTouchedCallback:()=>void=noop; private onChangeCallback:(quo:any)=>void=noop; //获取访问器 获取值():任意{ 返回此.innerValue; }; //设置访问器,包括调用onchange回调 设定值(v:任意){ 如果(v!==此.innerValue){ this.innerValue=v; 这是一个错误(v); } } //设置模糊 onBlur(){ 这个.ontouchdcallback(); } //从ControlValueAccessor接口 writeValue(值:任意){ if(值!==此.innerValue){ this.innerValue=值; } } //从ControlValueAccessor接口 注册变更(fn:任何){ this.onChangeCallback=fn; } //从ControlValueAccessor接口 注册人(fn:任何){ this.onTouchedCallback=fn; } } 然后,我们可以按如下方式使用此自定义控件: 输入数据:
谢谢阿尔梅罗·斯廷 尽管Angular 1的链接功能似乎使整个过程变得更简单,但本文似乎通过一个很好的示例向我展示了Angular 2材质通过内置接口使用的勇气: 这允许开发团队通过直接绑定到组件,但将绑定转发到我的模板中的复选框(或其他表单元素)来使用我的组件 如果链接中断,为了方便和文档持久性,请从站点引用: 因此,不用多说,这里是我们的组件: 从“@angular/core”导入{Component,forwardRef}; 从“@angular/forms”导入{NG_VALUE_访问器,ControlValueAccessor}; 常量noop=()=>{ }; 导出常量自定义\输入\控制\值\访问器:任意={ 提供:NG_值访问器, useExisting:forwardRef(()=>CustomInputComponent), 多:真的 }; @组成部分({ 选择器:“自定义输入”, 模板:` `, 提供者:[自定义\输入\控制\值\访问器] }) 导出类CustomInputComponent实现ControlValueAccessor{ //内部数据模型 私有内部值:any=''; //稍后提供的回调的占位符d //通过控制值访问器 私有onTouchedCallback:()=>void=noop; private onChangeCallback:(quo:any)=>void=noop; //获取访问器 获取值():任意{ 返回此.innerValue; }; //设置访问器,包括调用onchange回调 设定值(v:任意){ 如果(v!==此.innerValue){ this.innerValue=v; 这是一个错误(v); } } //设置模糊 onBlur(){ 这个.ontouchdcallback(); } //从ControlValueAccessor接口 writeValue(值:任意){ if(值!==此.innerValue){ this.innerValue=值; } } //从ControlValueAccessor接口 注册变更(fn:任何){ this.onChangeCallback=fn; } //从ControlValueAccessor接口 注册人(fn:任何){ this.onTouchedCallback=fn; } } 然后,我们可以按如下方式使用此自定义控件: 输入数据:
谢谢阿尔梅罗·斯廷 将绑定直接放在component@RomanC如果我这样做,该模型将不会应用于复选框的真实状态,并且我在控制台中也会遇到此错误:
EXCEPTION:error in./AppComponent c
<span class="checkbox-wrap">
<input type="checkbox" class="checkbox"> <!-- This should have all the bindings -->
<span class="checkbox-styling"></span>
<span class="checkbox-label"><ng-content></ng-content></span>
</span>
import { Component, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';
const noop = () => {
};
export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputComponent),
multi: true
};
@Component({
selector: 'custom-input',
template: `<div class="form-group">
<label><ng-content></ng-content>
<input [(ngModel)]="value"
class="form-control"
(blur)="onBlur()" >
</label>
</div>`,
providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR]
})
export class CustomInputComponent implements ControlValueAccessor {
//The internal data model
private innerValue: any = '';
//Placeholders for the callbacks which are later providesd
//by the Control Value Accessor
private onTouchedCallback: () => void = noop;
private onChangeCallback: (_: any) => void = noop;
//get accessor
get value(): any {
return this.innerValue;
};
//set accessor including call the onchange callback
set value(v: any) {
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
}
}
//Set touched on blur
onBlur() {
this.onTouchedCallback();
}
//From ControlValueAccessor interface
writeValue(value: any) {
if (value !== this.innerValue) {
this.innerValue = value;
}
}
//From ControlValueAccessor interface
registerOnChange(fn: any) {
this.onChangeCallback = fn;
}
//From ControlValueAccessor interface
registerOnTouched(fn: any) {
this.onTouchedCallback = fn;
}
}
<form>
<custom-input name="someValue"
[(ngModel)]="dataModel">
Enter data:
</custom-input>
</form>