angular2 自定义指令输入语法
angular2 custom directives inputs syntax
我创建了一个自定义指令并将 selector 值设置为“[unless-directive]”。
该指令获取一个布尔值并使用它来更改视图:
import {Directive, TemplateRef, ViewContainerRef} from 'angular2/core';
@Directive({
selector: '[unless-directive]',
inputs: ['givenBoolean : myDirectiveFunction']
})
export class UnlessDirective {
private _templateRef: TemplateRef;
private _viewContainerRef: ViewContainerRef;
constructor(_templateRef: TemplateRef, _viewContainerRef: ViewContainerRef) {
this._templateRef = _templateRef;
this._viewContainerRef = _viewContainerRef;
}
set myDirectiveFunction(condition: boolean) {
!condition ? this._viewContainerRef.createEmbeddedView(this._templateRef)
: this._viewContainerRef.clear();
}
}
在我的模板中,我尝试像这样传递条件:
<div name="customDirective">
<h2>Custom Directive</h2>
<div>
Enter true or false:
<br/>
<input type="text" #condition (keyup)="0"/>
<div *unless-directive [givenBoolean]="condition.value != 'false'">
Only shown if 'false' wad enterded!
</div>
</div>
</div>
当我 运行 代码时,我得到这个错误:
EXCEPTION: Template parse errors: Can't bind to 'givenBoolean' since
it isn't a known native property (" ... Only shown if 'false' wad enterded!"): StructualDirectivesComponent@47:39
我想我的语法有误,但我找不到哪里或为什么?
我在 Angular2 Docs 上查找了它,但该示例对输入和选择器使用了相同的名称,这是我试图避免的事情。
谁能知道更好的方法或者能找到我的语法问题?
谢谢。
*
prefix syntax is only a syntatic sugar。它扩展了指令声明。
The *
prefix syntax is a convenient way to skip the <template>
wrapper tags and focus directly on the HTML element to repeat or include. Angular sees the *
and expands the HTML into the <template>
tags for us.
这在 * and <template>
and Directive decorator/Lifecycle hooks 中有记录。
因此,在您的情况下,[givenBoolean]
属性 不应出现在指令中。换句话说,这个:
<div *unless-directive [givenBoolean]="condition.value != 'false'">
Only shown if 'false' wad enterded!
</div>
实际上变成:
<template [unless-directive]="">
<div [givenBoolean]="condition.value != 'false'">
Only shown if 'false' wad enterded!
</div>
</template>
并且由于 givenBoolean
不是组件(不是指令)中的 属性,因此出现错误。
因此,如果您想要自定义行为,我建议您尝试使用扩展版本,只有在它起作用后您才转到 *
语法,推理起来会更简单。
我创建了一个自定义指令并将 selector 值设置为“[unless-directive]”。
该指令获取一个布尔值并使用它来更改视图:
import {Directive, TemplateRef, ViewContainerRef} from 'angular2/core';
@Directive({
selector: '[unless-directive]',
inputs: ['givenBoolean : myDirectiveFunction']
})
export class UnlessDirective {
private _templateRef: TemplateRef;
private _viewContainerRef: ViewContainerRef;
constructor(_templateRef: TemplateRef, _viewContainerRef: ViewContainerRef) {
this._templateRef = _templateRef;
this._viewContainerRef = _viewContainerRef;
}
set myDirectiveFunction(condition: boolean) {
!condition ? this._viewContainerRef.createEmbeddedView(this._templateRef)
: this._viewContainerRef.clear();
}
}
在我的模板中,我尝试像这样传递条件:
<div name="customDirective">
<h2>Custom Directive</h2>
<div>
Enter true or false:
<br/>
<input type="text" #condition (keyup)="0"/>
<div *unless-directive [givenBoolean]="condition.value != 'false'">
Only shown if 'false' wad enterded!
</div>
</div>
</div>
当我 运行 代码时,我得到这个错误:
EXCEPTION: Template parse errors: Can't bind to 'givenBoolean' since it isn't a known native property (" ... Only shown if 'false' wad enterded!"): StructualDirectivesComponent@47:39
我想我的语法有误,但我找不到哪里或为什么?
我在 Angular2 Docs 上查找了它,但该示例对输入和选择器使用了相同的名称,这是我试图避免的事情。
谁能知道更好的方法或者能找到我的语法问题?
谢谢。
*
prefix syntax is only a syntatic sugar。它扩展了指令声明。
The
*
prefix syntax is a convenient way to skip the<template>
wrapper tags and focus directly on the HTML element to repeat or include. Angular sees the*
and expands the HTML into the<template>
tags for us.
这在 * and <template>
and Directive decorator/Lifecycle hooks 中有记录。
因此,在您的情况下,[givenBoolean]
属性 不应出现在指令中。换句话说,这个:
<div *unless-directive [givenBoolean]="condition.value != 'false'">
Only shown if 'false' wad enterded!
</div>
实际上变成:
<template [unless-directive]="">
<div [givenBoolean]="condition.value != 'false'">
Only shown if 'false' wad enterded!
</div>
</template>
并且由于 givenBoolean
不是组件(不是指令)中的 属性,因此出现错误。
因此,如果您想要自定义行为,我建议您尝试使用扩展版本,只有在它起作用后您才转到 *
语法,推理起来会更简单。