```typescript /** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { ChangeDetectionStrategy } from '../change_detection/constants'; import { Provider } from '../di'; import { Type } from '../type'; import { TypeDecorator } from '../util/decorators'; import { ViewEncapsulation } from './view'; /** * 指令装饰器/构造函数的类型。 * * @stable */ export interface DirectiveDecorator { /** * @它能做什么 将类标记为Angular指令,并收集指令配置 * 元数据. * * @如何使用 * * `.`` * import {Directive} from '@angular/core'; * * @Directive({ * selector: 'my-directive', * }) * export class MyDirective { * } * `.`` * * @描述 * * 指令装饰器允许您将类标记为Angular指令,并提供其他元数据, * 以确定如何在运行时处理,实例化和使用伪指令。 * * 指令允许您将行为附加到DOM中的元素 * * 一个指令必须属于一个NgModule, * 以便它被另一个指令,组件或应用程序使用。 * 要指定一个指令是NgModule的成员, * 您应该将其列在该NgModule的“声明”字段中。 * * 除了通过指令装饰器指定的元数据配置之外, * 指令可以通过实现各种生命周期钩子来控制其运行时行为. * * **元数据属性:** * * * **exportAs** - 组件实例在模板中导出的名称 * * **host** - 类属性映射到事件,属性和属性的主机元素绑定 * * **inputs** - 将类属性名称列表作为组件输入的数据绑定 * * **outputs** - 列出其他可以订阅的输出事件的类属性名称 * * **providers** - 该组件及其子组件可用的提供程序列表 * * **queries** - 配置可以注入组件的查询 * * **selector** - css选择器,用于标识模板中的此组件 * * @稳定 * @注解 */ (obj: Directive): TypeDecorator; /** * 请参阅{@link指令}装饰器。 */ new (obj: Directive): Directive; } export interface Directive { /** * 触发实例化指令的CSS选择器。 * * Angular仅允许指令触发不跨越元素边界的CSS选择器。 * * `selector` 可以被声明为以下之一: * * - `element-name`: 按元素名称选择. * - `.class`: 按类名选择. * - `[attribute]`: 按属性名称选择. * - `[attribute=value]`: 按属性名称和值选择. * - `:not(sub_selector)`: 只有当元素不匹配`sub_selector`时才选择. * - `selector1, selector2`: 选择“selector1”或“selector2”是否匹配. * * * ### 例 * * 假设我们有一个`input [type = text]选择器的指令。 * * 和以下HTML: * * `.``html *
* * * * `.`` * * 该指令只能在`“元素上实例化. * */ selector?: string; /** * 枚举一个指令的数据绑定输入属性集 * * Angular在更改检测期间自动更新输入属性. * * `inputs`属性将一组`directiveProperty`定义为`bindingProperty` 组态: * * - `directiveProperty`指定写入值的组件属性. * - `bindingProperty`指定读取值的DOM属性. * * 当没有提供`bindingProperty`时,它被假定为等于`directiveProperty`. * * ### 示例([live demo](http://plnkr.co/edit/ivhfXY?p=preview)) * * 以下示例创建具有两个数据绑定属性的组件. * * `.``typescript * @Component({ * selector: 'bank-account', * inputs: ['bankName', 'id: account-id'], * template: ` * Bank Name: {{bankName}} * Account Id: {{id}} * ` * }) * class BankAccount { * bankName: string; * id: string; * * // 此属性未绑定,不会被Angular自动更新 * normalizedBankName: string; * } * * @Component({ * selector: 'app', * template: ` * * ` * }) * class App {} * `.`` * */ inputs?: string[]; /** * 枚举一组事件绑定的输出属性。 * * 当输出属性发出一个事件时,附加到该事件的事件处理程序调用该模板。 * * `outputs`属性将一组`directiveProperty`定义为`bindingProperty`配置: * * - `directiveProperty`指定发出事件的组件属性. * - `bindingProperty`指定事件处理程序所附加的DOM属性. * * ### 示例([live demo](http://plnkr.co/edit/d5CNq7?p=preview)) * * `.``typescript * @Directive({ * selector: 'interval-dir', * outputs: ['everySecond', 'five5Secs: everyFiveSeconds'] * }) * class IntervalDir { * everySecond = new EventEmitter(); * five5Secs = new EventEmitter(); * * constructor() { * setInterval(() => this.everySecond.emit("event"), 1000); * setInterval(() => this.five5Secs.emit("event"), 5000); * } * } * * @Component({ * selector: 'app', * template: ` * * * ` * }) * class App { * everySecond() { console.log('second'); } * everyFiveSeconds() { console.log('five seconds'); } * } * `.`` * */ outputs?: string[]; /** * 指定与主机元素相关的事件,操作,属性和属性. * * ## 主机监听器 * * 通过一组`(event)`指向`method`来指定一个指令侦听哪个DOM事件 * 键值对: * * - `event`: 指令监听的DOM事件. * - `statement`: 发生事件时执行的语句. * 如果该语句的评估返回`false`,那么`preventDefault`应用于DOM事件 * * 要侦听全局事件,必须将事件名称添加到目标. * 目标可以是“window”,“document”或“body”. * * 编写指令事件绑定时,还可以参考$ event局部变量. * * ### 示例([live demo](http://plnkr.co/edit/DlA5KU?p=preview)) * * 以下示例声明将点击监听器附加到按钮并计数点击的指令. * * `.``typescript * @Directive({ * selector: 'button[counting]', * host: { * '(click)': 'onClick($event.target)' * } * }) * class CountClicks { * numberOfClicks = 0; * * onClick(btn) { * console.log("button", btn, "number of clicks:", this.numberOfClicks++); * } * } * * @Component({ * selector: 'app', * template: `` * }) * class App {} * `.`` * * ## 主机属性绑定 * * 指定指令更新的DOM属性。 * * 在更改检测期间,Angular会自动检查主机属性绑定. * 如果绑定更改,它将更新指令的主机元素. * * ### 示例([live demo](http://plnkr.co/edit/gNg0ED?p=preview)) * * 以下示例创建了一个在DOM元素上设置“valid”和“invalid”类的指令, * 该元素具有ngModel伪指令. * * `.``typescript * @Directive({ * selector: '[ngModel]', * host: { * '[class.valid]': 'valid', * '[class.invalid]': 'invalid' * } * }) * class NgModelStatus { * constructor(public control:NgModel) {} * get valid { return this.control.valid; } * get invalid { return this.control.invalid; } * } * * @Component({ * selector: 'app', * template: `` * }) * class App { * prop; * } * `.`` * * ## 属性 * * 指定应传播到主机元素的静态属性. * * ### 例 * * 在这个例子中, * 使用主机元素(这里:`
`)上的`my-button`指令 * (例如:`
`)将确保该元素将获得“按钮 “角色。. * * `.``typescript * @Directive({ * selector: '[my-button]', * host: { * 'role': 'button' * } * }) * class MyButton { * } * `.`` */ host?: { [key: string]: string; }; /** * 定义指令和其轻型DOM子项可见的可注射对象集合. * * ## 简例 * * 这是一个可以注入的类的例子: * * `.`` * class Greeter { * greet(name:string) { * return 'Hello ' + name + '!'; * } * } * * @Directive({ * selector: 'greet', * providers: [ * Greeter * ] * }) * class HelloWorld { * greeter:Greeter; * * constructor(greeter:Greeter) { * this.greeter = greeter; * } * } * `.`` */ providers?: Provider[]; /** * 定义可以在模板中使用的名称,以将此指令分配给变量. * * ## 简例 * * `.`` * @Directive({ * selector: 'child-dir', * exportAs: 'child' * }) * class ChildDir { * } * * @Component({ * selector: 'main', * template: `` * }) * class MainComponent { * } * * `.`` */ exportAs?: string; /** * 配置将注入到指令中的查询. * * 内容查询在调用`ngAfterContentInit`回调之前设置. * 查询查询是在调用`ngAfterViewInit`回调之前设置的. * * ### 例 * * `.`` * @Component({ * selector: 'someDir', * queries: { * contentChildren: new ContentChildren(ChildDirective), * viewChildren: new ViewChildren(ChildDirective) * }, * template: '' * }) * class SomeDir { * contentChildren: QueryList, * viewChildren: QueryList * * ngAfterContentInit() { * // 内容节点设置 * } * * ngAfterViewInit() { * // 设图节点设在 * } * } * `.`` */ queries?: { [key: string]: any; }; } /** * 指令装饰器和元数据. * * @稳定 * @注解 */ export declare const Directive: DirectiveDecorator; /** * Component装饰器/构造函数的类型. * * @stable */ export interface ComponentDecorator { /** * @whatItDoes将类标记为角度组件并收集组件配置元数据. * * @如何使用 * * {@example core/ts/metadata/metadata.ts region='component'} * * @描述 * 组件装饰器允许您将类标记为角度组件, * 并提供其他元数据,以确定如何在运行时处理, * 实例化和使用组件. * * 组件是Angular应用程序中UI最基本的构建块. * Angular应用是一个角度的组件树. * Angular组件是指令的一个子集。 * 与指令不同,组件始终具有模板, * 并且只能在模板中的元素中实例化一个组件. * * 组件必须属于NgModule, * 以便它可以被另一个组件或应用程序使用。 * 要指定组件是NgModule的成员, * 应将其列在该NgModule的“声明”字段中。 * * 除了通过Component装饰器指定的元数据配置之外, * 组件可以通过实现各种生命周期钩子来控制其运行时行为. * * **元数据属性:** * * * **animations** - 该组件的动画列表 * * **changeDetection** - 改变该组件使用的检测策略 * * **encapsulation** - 该组件使用的样式封装策略 * * **entryComponents** - 动态插入到此组件的视图中的组件列表 * * **exportAs** - 组件实例在模板中导出的名称 * * **host** - 类属性映射到事件,属性和属性的主机元素绑定 * * **inputs** - 将类属性名称列表作为组件输入的数据绑定 * * **interpolation** - 此组件模板中使用的自定义插值标记 * * **moduleId** - 定义此组件的文件的ES / CommonJS模块ID * * **outputs** - 列出其他可以订阅的输出事件的类属性名称 * * **providers** - 该组件及其子组件可用的提供程序列表 * * **queries** - 配置可以注入组件的查询 * * **selector** - css选择器,用于标识模板中的此组件 * * **styleUrls** - 要应用于此组件视图的样式表的URL列表 * * **styles** - 内联定义的样式应用于此组件的视图 * * **template** - 视图的内联定义模板 * * **templateUrl** - url到包含视图模板的外部文件 * * **viewProviders** - 此组件及其查看子项可用的提供程序列表 * * ### 例 * * {@example core/ts/metadata/metadata.ts region='component'} * * @stable * @Annotation */ (obj: Component): TypeDecorator; /** * 请参阅{@link Component}装饰器。 */ new (obj: Component): Component; } /** * 组件元数据的类型. * * @stable */ export interface Component extends Directive { /** * 定义使用的变更检测策略. * * 当一个组件被实例化时,Angular创建一个变化检测器, * 它负责传播组件的绑定. * * `changeDetection`属性定义, * 是否会每次检查更改检测,或仅当组件告诉它进行检查时. */ changeDetection?: ChangeDetectionStrategy; /** * 定义可视对象的集合,使其DOM DOM子项的视图可见. * * ## Simple Example * * 这是一个可以注入的类的例子: * * `.`` * class Greeter { * greet(name:string) { * return 'Hello ' + name + '!'; * } * } * * @Directive({ * selector: 'needs-greeter' * }) * class NeedsGreeter { * greeter:Greeter; * * constructor(greeter:Greeter) { * this.greeter = greeter; * } * } * * @Component({ * selector: 'greet', * viewProviders: [ * Greeter * ], * template: `` * }) * class HelloWorld { * } * * `.`` */ viewProviders?: Provider[]; /** * 包含组件的模块的模块ID. * 需要能够解析模板和样式的相对URL. * 在CommonJS中,这可以始终设置为`module.id`,同样的SystemJS在每个模块中都会显示`__moduleName`变量. * * * ## 简例 * * `.`` * @Directive({ * selector: 'someDir', * moduleId: module.id * }) * class SomeDir { * } * * `.`` */ moduleId?: string; /** * 指定Angular组件的模板URL. * *每个View只能定义“templateUrl”或“template”之一. */ templateUrl?: string; /** * 指定Angular组件的内联模板. * * 每个组件只能定义“templateUrl”或“template”之一. */ template?: string; /** * 指定Angular组件的样式表URL. */ styleUrls?: string[]; /** * 指定Angular组件的内联样式表. */ styles?: string[]; /** * 通过类似动画的DSL在组件上定义动画。 * 描述动画的这种DSL方法允许灵活性, * 这既有益于开发人员和框架. * * 通过侦听在模板中的元素上发生的状态更改来进行动画处理。 * 当发生状态变化时,角度可以利用它们之间的弧线并使其动画化。 * 这与CSS过渡的工作方式类似,但是通过使用编程式DSL,动画不限于DOM特定的环境. * (Angular还可以在幕后进行优化,使动画更加出色.) * * 为了使动画可以使用,动画状态更改位于{@link触发器动画触发器}中, * 它们位于“动画”注释元数据的内部。 * 在触发器中,可以放置{@link状态}和{@link转换转换}条目. * * `.``typescript * @Component({ * selector: 'animation-cmp', * templateUrl: 'animation-cmp.html', * animations: [ * // 这是我们的动画触发器,它将包含我们的状态变化动画. * trigger('myTriggerName', [ * // 动画完成后,为元素定义的“on”和“off”状态的样式将保留在元素上. * state('on', style({ opacity: 1 }), * state('off', style({ opacity: 0 }), * * // 这是我们的动画,当这个状态变化跳跃是真的时,它开始了 * transition('on => off', [ * animate("1s") * ]) * ]) * ] * }) * `.`` * * 如上面的代码所示, * 一组相关的动画状态都包含在动画“触发器”(上面的代码示例称为触发器iggerName)中)。 * 当触发器被创建时,它可以被绑定到组件模板中的一个元素上, * 前缀是一个前缀为“@”符号的属性,后跟触发器名称和用于确定该触发器的状态值的表达式. * * `.``html * *
...
* `.`` * * 对于要执行的状态更改,“expression”值必须将值从现有值更改为我们将动画设置为动画 * (在上面的示例中,我们正在监听“on”和“off”之间的状态更改`)。 * 附加到触发器的“expression”值必须是可以使用模板/组件上下文来评估的值. * * ### DSL动画功能 * * 请访问下面列出的每个动画DSL功能,以更好地了解如何以及为什么用于在Angular中制作动画: * * - {@link trigger trigger()} * - {@link state state()} * - {@link transition transition()} * - {@link group group()} * - {@link sequence sequence()} * - {@link style style()} * - {@link animate animate()} * - {@link keyframes keyframes()} */ animations?: any[]; /** * 指定模板和样式应如何封装: * - {@link ViewEncapsulation#Native `ViewEncapsulation.Native`} to use shadow roots - 仅在平台上可用的情况下才起作用, * - {@link ViewEncapsulation#Emulated `ViewEncapsulation.Emulated`} 使用模仿本机行为的shimmed CSS, * - {@link ViewEncapsulation#None `ViewEncapsulation.None`} 使用全局CSS而没有任何封装. * * 当没有为组件定义“封装”时,将使用{@link CompilerOptions}中的默认值。 默认为“ViewEncapsulation.Emulated”}。 提供一个新的`CompilerOptions`来覆盖这个值. * * 如果封装设置为“ViewEncapsulation.Emulated”,并且组件没有“样式”和“styleUrls”,封装将自动切换到“ViewEncapsulation.None”. */ encapsulation?: ViewEncapsulation; /** * 覆盖默认的封装开始和结束分隔符(分别为{{`和`}}`) */ interpolation?: [string, string]; /** * 定义此组件时,还要定义应编译的组件。 对于此处列出的每个组件,Angular将创建一个{@link ComponentFactory}并将其存储在{@link ComponentFactoryResolver}. */ entryComponents?: Array | any[]>; } /** * 组件装饰器和元数据. * * @stable * @Annotation */ export declare const Component: ComponentDecorator; /** * 管道装饰器/构造函数的类型. * * @stable */ export interface PipeDecorator { /** * 声明可重复使用的管道功能. * * 只有当输入或任何参数发生变化时,才会重新评估“纯”管道. * * 当未指定时,管道默认为纯. */ (obj: Pipe): TypeDecorator; /** * 请参阅{@link Pipe}装饰器. */ new (obj: Pipe): Pipe; } /** * 管道元数据的类型. * * @stable */ export interface Pipe { name: string; pure?: boolean; } /** * 管道装饰器和元数据. * * @stable * @Annotation */ export declare const Pipe: PipeDecorator; /** * 输入装饰器/构造函数的类型. * * @stable */ export interface InputDecorator { /** * 声明数据绑定输入属性. * * Angular. * * `Input`接受一个可选参数,指定在模板中实例化组件时使用的名称。 未提供时,将使用装饰属性的名称. * * ### Example * * 以下示例创建一个具有两个输入属性的组件. * * `.``typescript * @Component({ * selector: 'bank-account', * template: ` * Bank Name: {{bankName}} * Account Id: {{id}} * ` * }) * class BankAccount { * @Input() bankName: string; * @Input('account-id') id: string; * * // 此属性未绑定,不会被Angular自动更新 * normalizedBankName: string; * } * * @Component({ * selector: 'app', * template: ` * * ` * }) * * class App {} * `.`` * @stable */ (bindingPropertyName?: string): any; new (bindingPropertyName?: string): any; } /** * 输入元数据的类型. * * @stable */ export interface Input { /** * 在模板中实例化组件时使用的名称. */ bindingPropertyName?: string; } /** * 输入装饰器和元数据. * * @stable * @Annotation */ export declare const Input: InputDecorator; /** * 输出装饰器/构造函数的类型. * * @stable */ export interface OutputDecorator { /** * 声明一个事件绑定的输出属性. * * 当输出属性发出一个事件时,附加到该事件的事件处理程序调用该模板. * * `Output`采用一个可选参数,指定在模板中实例化组件时使用的名称。 * 未提供时,将使用装饰属性的名称. * * ### 例 * * `.``typescript * @Directive({ * selector: 'interval-dir', * }) * class IntervalDir { * @Output() everySecond = new EventEmitter(); * @Output('everyFiveSeconds') five5Secs = new EventEmitter(); * * constructor() { * setInterval(() => this.everySecond.emit("event"), 1000); * setInterval(() => this.five5Secs.emit("event"), 5000); * } * } * * @Component({ * selector: 'app', * template: ` * * * ` * }) * class App { * everySecond() { console.log('second'); } * everyFiveSeconds() { console.log('five seconds'); } * } * `.`` * @stable */ (bindingPropertyName?: string): any; new (bindingPropertyName?: string): any; } /** * 输出元数据的类型. * * @stable */ export interface Output { bindingPropertyName?: string; } /** * 输出装饰器和元数据. * * @stable * @Annotation */ export declare const Output: OutputDecorator; /** * HostBinding装饰器/构造函数的类型. * * @stable */ export interface HostBindingDecorator { /** * 声明主机属性绑定. * * 在更改检测期间,Angular会自动检查主机属性绑定. * 如果绑定更改,它将更新指令的主机元素. * * `HostBinding`接受一个可选参数, * 指定要更新的主机元素的属性名称。 * 未提供时,使用类属性名称. * * ### 例 * * 以下示例创建了一个在DOM元素上设置“valid”和“invalid”类的指令,该元素具有ngModel伪指令. * * `.``typescript * @Directive({selector: '[ngModel]'}) * class NgModelStatus { * constructor(public control:NgModel) {} * @HostBinding('class.valid') get valid() { return this.control.valid; } * @HostBinding('class.invalid') get invalid() { return this.control.invalid; } * } * * @Component({ * selector: 'app', * template: ``, * }) * class App { * prop; * } * `.`` * @stable */ (hostPropertyName?: string): any; new (hostPropertyName?: string): any; } /** * HostBinding元数据的类型. * * @stable */ export interface HostBinding { hostPropertyName?: string; } /** * HostBinding装饰器和元数据. * * @stable * @Annotation */ export declare const HostBinding: HostBindingDecorator; /** * HostListener装饰器/构造函数的类型. * * @stable */ export interface HostListenerDecorator { /** * 声明主机侦听器. * * 当主机元素发出指定的事件时,Angular将调用装饰的方法. * * 如果装饰方法返回`false`,那么`preventDefault`应用于DOM事件. * * ### Example * * 以下示例声明将点击监听器附加到按钮并计数点击的指令. * * `.``typescript * @Directive({selector: 'button[counting]'}) * class CountClicks { * numberOfClicks = 0; * * @HostListener('click', ['$event.target']) * onClick(btn) { * console.log('button', btn, 'number of clicks:', this.numberOfClicks++); * } * } * * @Component({ * selector: 'app', * template: '', * }) * class App {} * `.`` * @stable * @Annotation */ (eventName: string, args?: string[]): any; new (eventName: string, args?: string[]): any; } /** * HostListener元数据的类型. * * @stable */ export interface HostListener { eventName?: string; args?: string[]; } /** * HostListener装饰器和元数据. * * @stable * @Annotation */ export declare const HostListener: HostListenerDecorator; ```