2016-06-23 09:47:54 -07:00
|
|
|
/**
|
|
|
|
* @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
|
|
|
|
*/
|
|
|
|
|
2015-08-14 10:03:45 -07:00
|
|
|
/**
|
|
|
|
* This indirection is needed to free up Component, etc symbols in the public API
|
|
|
|
* to be used by the decorator versions of these annotations.
|
|
|
|
*/
|
|
|
|
|
2016-06-08 16:38:52 -07:00
|
|
|
import {ChangeDetectionStrategy} from '../src/change_detection/change_detection';
|
2016-08-02 15:53:34 -07:00
|
|
|
import {Type} from '../src/facade/lang';
|
2015-08-14 10:03:45 -07:00
|
|
|
|
2016-05-25 12:46:22 -07:00
|
|
|
import {AnimationEntryMetadata} from './animation/metadata';
|
2016-06-08 16:38:52 -07:00
|
|
|
import {AttributeMetadata, ContentChildMetadata, ContentChildrenMetadata, QueryMetadata, ViewChildMetadata, ViewChildrenMetadata, ViewQueryMetadata} from './metadata/di';
|
2016-07-29 02:10:30 -07:00
|
|
|
import {ComponentMetadata, ComponentMetadataType, DirectiveMetadata, DirectiveMetadataType, HostBindingMetadata, HostListenerMetadata, InputMetadata, OutputMetadata, PipeMetadata, PipeMetadataType} from './metadata/directives';
|
|
|
|
import {ModuleWithProviders, NgModuleMetadata, NgModuleMetadataType, SchemaMetadata} from './metadata/ng_module';
|
2016-07-28 06:31:26 -07:00
|
|
|
import {ViewEncapsulation} from './metadata/view';
|
2016-08-02 15:53:34 -07:00
|
|
|
import {TypeDecorator, makeDecorator, makeParamDecorator, makePropDecorator} from './util/decorators';
|
2016-06-08 16:38:52 -07:00
|
|
|
|
2016-07-25 00:36:30 -07:00
|
|
|
export {ANALYZE_FOR_ENTRY_COMPONENTS, AttributeMetadata, ContentChildMetadata, ContentChildrenMetadata, QueryMetadata, ViewChildMetadata, ViewChildrenMetadata, ViewQueryMetadata} from './metadata/di';
|
2016-07-29 02:10:30 -07:00
|
|
|
export {ComponentMetadata, ComponentMetadataType, DirectiveMetadata, DirectiveMetadataType, HostBindingMetadata, HostListenerMetadata, InputMetadata, OutputMetadata, PipeMetadata, PipeMetadataType} from './metadata/directives';
|
2016-06-08 16:38:52 -07:00
|
|
|
export {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, DoCheck, OnChanges, OnDestroy, OnInit} from './metadata/lifecycle_hooks';
|
2016-07-29 02:10:30 -07:00
|
|
|
export {CUSTOM_ELEMENTS_SCHEMA, ModuleWithProviders, NgModuleMetadata, NgModuleMetadataType, SchemaMetadata} from './metadata/ng_module';
|
2016-06-08 16:38:52 -07:00
|
|
|
export {ViewEncapsulation, ViewMetadata} from './metadata/view';
|
2015-08-14 10:03:45 -07:00
|
|
|
|
2015-06-12 23:51:42 -07:00
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-08-14 10:03:45 -07:00
|
|
|
* Interface for the {@link DirectiveMetadata} decorator function.
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2016-07-07 23:02:35 -07:00
|
|
|
* See {@link DirectiveMetadataFactory}.
|
2016-06-27 12:27:23 -07:00
|
|
|
*
|
|
|
|
* @stable
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2015-07-02 22:26:07 +02:00
|
|
|
export interface DirectiveDecorator extends TypeDecorator {}
|
2015-06-12 23:51:42 -07:00
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-08-14 10:03:45 -07:00
|
|
|
* Interface for the {@link ComponentMetadata} decorator function.
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* See {@link ComponentFactory}.
|
2016-06-27 12:27:23 -07:00
|
|
|
*
|
|
|
|
* @stable
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-07-28 06:31:26 -07:00
|
|
|
export interface ComponentDecorator extends TypeDecorator {}
|
2015-06-12 23:51:42 -07:00
|
|
|
|
2016-06-28 09:54:42 -07:00
|
|
|
/**
|
2016-07-18 03:50:31 -07:00
|
|
|
* Interface for the {@link NgModuleMetadata} decorator function.
|
2016-06-28 09:54:42 -07:00
|
|
|
*
|
2016-07-18 03:50:31 -07:00
|
|
|
* See {@link NgModuleMetadataFactory}.
|
2016-06-28 09:54:42 -07:00
|
|
|
*
|
|
|
|
* @stable
|
|
|
|
*/
|
2016-07-18 03:50:31 -07:00
|
|
|
export interface NgModuleDecorator extends TypeDecorator {}
|
2016-06-28 09:54:42 -07:00
|
|
|
|
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-08-14 10:03:45 -07:00
|
|
|
* {@link DirectiveMetadata} factory for creating annotations, decorators or DSL.
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as TypeScript Decorator
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* {@example core/ts/metadata/metadata.ts region='directive'}
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as ES5 DSL
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyDirective = ng
|
|
|
|
* .Directive({...})
|
|
|
|
* .Class({
|
|
|
|
* constructor: function() {
|
|
|
|
* ...
|
|
|
|
* }
|
|
|
|
* })
|
|
|
|
* ```
|
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as ES5 annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyDirective = function() {
|
|
|
|
* ...
|
|
|
|
* };
|
|
|
|
*
|
|
|
|
* MyDirective.annotations = [
|
|
|
|
* new ng.Directive({...})
|
|
|
|
* ]
|
|
|
|
* ```
|
2016-06-27 12:27:23 -07:00
|
|
|
*
|
|
|
|
* @stable
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface DirectiveMetadataFactory {
|
2016-07-29 02:10:30 -07:00
|
|
|
(obj: DirectiveMetadataType): DirectiveDecorator;
|
|
|
|
new (obj: DirectiveMetadataType): DirectiveMetadata;
|
2015-06-12 23:51:42 -07:00
|
|
|
}
|
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-09-16 23:28:16 -07:00
|
|
|
* {@link ComponentMetadata} factory for creating annotations, decorators or DSL.
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as TypeScript Decorator
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* {@example core/ts/metadata/metadata.ts region='component'}
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as ES5 DSL
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyComponent = ng
|
|
|
|
* .Component({...})
|
|
|
|
* .Class({
|
|
|
|
* constructor: function() {
|
|
|
|
* ...
|
|
|
|
* }
|
|
|
|
* })
|
|
|
|
* ```
|
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as ES5 annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyComponent = function() {
|
|
|
|
* ...
|
|
|
|
* };
|
|
|
|
*
|
|
|
|
* MyComponent.annotations = [
|
2015-10-11 07:41:19 -07:00
|
|
|
* new ng.Component({...})
|
2015-07-07 08:15:58 +02:00
|
|
|
* ]
|
|
|
|
* ```
|
2016-06-27 12:27:23 -07:00
|
|
|
*
|
|
|
|
* @stable
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface ComponentMetadataFactory {
|
2016-07-29 02:10:30 -07:00
|
|
|
(obj: ComponentMetadataType): ComponentDecorator;
|
|
|
|
new (obj: ComponentMetadataType): ComponentMetadata;
|
2015-06-12 23:51:42 -07:00
|
|
|
}
|
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-08-14 10:03:45 -07:00
|
|
|
* {@link AttributeMetadata} factory for creating annotations, decorators or DSL.
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as TypeScript Decorator
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* {@example core/ts/metadata/metadata.ts region='attributeFactory'}
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as ES5 DSL
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyComponent = ng
|
|
|
|
* .Component({...})
|
|
|
|
* .Class({
|
|
|
|
* constructor: [new ng.Attribute('title'), function(title) {
|
|
|
|
* ...
|
|
|
|
* }]
|
|
|
|
* })
|
|
|
|
* ```
|
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example as ES5 annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyComponent = function(title) {
|
|
|
|
* ...
|
|
|
|
* };
|
|
|
|
*
|
|
|
|
* MyComponent.annotations = [
|
2015-10-11 07:41:19 -07:00
|
|
|
* new ng.Component({...})
|
2015-07-07 08:15:58 +02:00
|
|
|
* ]
|
|
|
|
* MyComponent.parameters = [
|
|
|
|
* [new ng.Attribute('title')]
|
|
|
|
* ]
|
|
|
|
* ```
|
2016-06-27 12:27:23 -07:00
|
|
|
*
|
|
|
|
* @stable
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface AttributeMetadataFactory {
|
2015-07-02 22:26:07 +02:00
|
|
|
(name: string): TypeDecorator;
|
2015-08-14 10:03:45 -07:00
|
|
|
new (name: string): AttributeMetadata;
|
2015-07-02 22:26:07 +02:00
|
|
|
}
|
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-08-14 10:03:45 -07:00
|
|
|
* {@link QueryMetadata} factory for creating annotations, decorators or DSL.
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
2015-09-17 22:33:51 -07:00
|
|
|
* ### Example as TypeScript Decorator
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
2016-04-28 17:50:03 -07:00
|
|
|
* import {Query, QueryList, Component} from '@angular/core';
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* @Component({...})
|
|
|
|
* class MyComponent {
|
2015-09-17 22:33:51 -07:00
|
|
|
* constructor(@Query(SomeType) queryList: QueryList<SomeType>) {
|
2015-07-07 08:15:58 +02:00
|
|
|
* ...
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
2015-09-17 22:33:51 -07:00
|
|
|
* ### Example as ES5 DSL
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyComponent = ng
|
|
|
|
* .Component({...})
|
|
|
|
* .Class({
|
|
|
|
* constructor: [new ng.Query(SomeType), function(queryList) {
|
|
|
|
* ...
|
|
|
|
* }]
|
|
|
|
* })
|
|
|
|
* ```
|
|
|
|
*
|
2015-09-17 22:33:51 -07:00
|
|
|
* ### Example as ES5 annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* var MyComponent = function(queryList) {
|
|
|
|
* ...
|
|
|
|
* };
|
|
|
|
*
|
|
|
|
* MyComponent.annotations = [
|
2015-10-11 07:41:19 -07:00
|
|
|
* new ng.Component({...})
|
2015-07-07 08:15:58 +02:00
|
|
|
* ]
|
|
|
|
* MyComponent.parameters = [
|
|
|
|
* [new ng.Query(SomeType)]
|
|
|
|
* ]
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @deprecated
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface QueryMetadataFactory {
|
2016-06-08 16:38:52 -07:00
|
|
|
(selector: Type|string,
|
2016-04-18 13:24:42 -07:00
|
|
|
{descendants, read}?: {descendants?: boolean, read?: any}): ParameterDecorator;
|
2016-06-08 16:38:52 -07:00
|
|
|
new (selector: Type|string, {descendants, read}?: {descendants?: boolean, read?: any}):
|
|
|
|
QueryMetadata;
|
2015-07-02 22:26:07 +02:00
|
|
|
}
|
|
|
|
|
2015-12-03 15:49:09 -08:00
|
|
|
/**
|
|
|
|
* Factory for {@link ContentChildren}.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-12-03 15:49:09 -08:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface ContentChildrenMetadataFactory {
|
2016-06-08 16:38:52 -07:00
|
|
|
(selector: Type|string, {descendants, read}?: {descendants?: boolean, read?: any}): any;
|
|
|
|
new (selector: Type|string, {descendants, read}?: {descendants?: boolean, read?: any}):
|
|
|
|
ContentChildrenMetadata;
|
2015-09-17 18:45:14 -07:00
|
|
|
}
|
|
|
|
|
2015-12-03 15:49:09 -08:00
|
|
|
/**
|
|
|
|
* Factory for {@link ContentChild}.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-12-03 15:49:09 -08:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface ContentChildMetadataFactory {
|
2016-06-08 16:38:52 -07:00
|
|
|
(selector: Type|string, {read}?: {read?: any}): any;
|
|
|
|
new (selector: Type|string, {read}?: {read?: any}): ContentChildMetadataFactory;
|
2015-09-19 18:39:35 -07:00
|
|
|
}
|
|
|
|
|
2015-12-03 15:49:09 -08:00
|
|
|
/**
|
|
|
|
* Factory for {@link ViewChildren}.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-12-03 15:49:09 -08:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface ViewChildrenMetadataFactory {
|
2016-06-08 16:38:52 -07:00
|
|
|
(selector: Type|string, {read}?: {read?: any}): any;
|
|
|
|
new (selector: Type|string, {read}?: {read?: any}): ViewChildrenMetadata;
|
2015-09-17 18:45:14 -07:00
|
|
|
}
|
|
|
|
|
2015-12-03 15:49:09 -08:00
|
|
|
/**
|
|
|
|
* Factory for {@link ViewChild}.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-12-03 15:49:09 -08:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface ViewChildMetadataFactory {
|
2016-06-08 16:38:52 -07:00
|
|
|
(selector: Type|string, {read}?: {read?: any}): any;
|
|
|
|
new (selector: Type|string, {read}?: {read?: any}): ViewChildMetadataFactory;
|
2015-09-19 18:39:35 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-08-07 11:41:38 -07:00
|
|
|
/**
|
2015-08-14 10:03:45 -07:00
|
|
|
* {@link PipeMetadata} factory for creating decorators.
|
2015-08-07 11:41:38 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* ### Example
|
2015-08-07 11:41:38 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* {@example core/ts/metadata/metadata.ts region='pipe'}
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-08-07 11:41:38 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface PipeMetadataFactory {
|
2016-07-29 02:10:30 -07:00
|
|
|
(obj: PipeMetadataType): any;
|
|
|
|
new (obj: PipeMetadataType): any;
|
2015-08-07 11:41:38 -07:00
|
|
|
}
|
2015-05-04 11:11:22 -07:00
|
|
|
|
2015-09-03 15:10:48 -07:00
|
|
|
/**
|
2015-09-30 20:59:23 -07:00
|
|
|
* {@link InputMetadata} factory for creating decorators.
|
2015-09-03 15:10:48 -07:00
|
|
|
*
|
2015-09-30 20:59:23 -07:00
|
|
|
* See {@link InputMetadata}.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-09-03 15:10:48 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface InputMetadataFactory {
|
2015-09-03 15:10:48 -07:00
|
|
|
(bindingPropertyName?: string): any;
|
|
|
|
new (bindingPropertyName?: string): any;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-09-30 20:59:23 -07:00
|
|
|
* {@link OutputMetadata} factory for creating decorators.
|
2015-09-03 15:10:48 -07:00
|
|
|
*
|
2015-09-30 20:59:23 -07:00
|
|
|
* See {@link OutputMetadata}.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-09-03 15:10:48 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface OutputMetadataFactory {
|
2015-09-03 15:10:48 -07:00
|
|
|
(bindingPropertyName?: string): any;
|
|
|
|
new (bindingPropertyName?: string): any;
|
|
|
|
}
|
|
|
|
|
2015-09-04 14:07:16 -07:00
|
|
|
/**
|
2015-10-01 15:47:51 -07:00
|
|
|
* {@link HostBindingMetadata} factory function.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-09-04 14:07:16 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface HostBindingMetadataFactory {
|
2015-09-04 14:07:16 -07:00
|
|
|
(hostPropertyName?: string): any;
|
|
|
|
new (hostPropertyName?: string): any;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-10-01 15:47:51 -07:00
|
|
|
* {@link HostListenerMetadata} factory function.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2015-09-04 14:07:16 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export interface HostListenerMetadataFactory {
|
2015-09-04 14:07:16 -07:00
|
|
|
(eventName: string, args?: string[]): any;
|
|
|
|
new (eventName: string, args?: string[]): any;
|
|
|
|
}
|
|
|
|
|
2016-06-28 09:54:42 -07:00
|
|
|
/**
|
2016-07-18 03:50:31 -07:00
|
|
|
* {@link NgModuleMetadata} factory for creating annotations, decorators or DSL.
|
2016-06-28 09:54:42 -07:00
|
|
|
*
|
2016-07-18 03:50:31 -07:00
|
|
|
* @experimental
|
2016-06-28 09:54:42 -07:00
|
|
|
*/
|
2016-07-18 03:50:31 -07:00
|
|
|
export interface NgModuleMetadataFactory {
|
2016-07-29 02:10:30 -07:00
|
|
|
(obj?: NgModuleMetadataType): NgModuleDecorator;
|
|
|
|
new (obj?: NgModuleMetadataType): NgModuleMetadata;
|
2016-06-28 09:54:42 -07:00
|
|
|
}
|
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from ComponentMetadata.
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declare reusable UI building blocks for an application.
|
|
|
|
*
|
2016-03-08 13:36:48 -08:00
|
|
|
* Each Angular component requires a single `@Component` annotation. The `@Component`
|
2015-10-12 10:12:11 -07:00
|
|
|
* annotation specifies when a component is instantiated, and which properties and hostListeners it
|
|
|
|
* binds to.
|
|
|
|
*
|
|
|
|
* When a component is instantiated, Angular
|
|
|
|
* - creates a shadow DOM for the component.
|
|
|
|
* - loads the selected template into the shadow DOM.
|
|
|
|
* - creates all the injectable objects configured with `providers` and `viewProviders`.
|
|
|
|
*
|
|
|
|
* All template expressions and statements are then evaluated against the component instance.
|
|
|
|
*
|
|
|
|
* ## Lifecycle hooks
|
|
|
|
*
|
2016-07-07 23:02:35 -07:00
|
|
|
* When the component class implements some {@linkDocs guide/lifecycle-hooks} the
|
2016-07-06 13:57:38 -07:00
|
|
|
* callbacks are called by the change detection at defined points in time during the life of the
|
|
|
|
* component.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* {@example core/ts/metadata/metadata.ts region='component'}
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Component: ComponentMetadataFactory =
|
2016-07-28 06:31:26 -07:00
|
|
|
<ComponentMetadataFactory>makeDecorator(ComponentMetadata);
|
2015-10-12 10:12:11 -07:00
|
|
|
|
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from DirectiveMetadata.
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Directives allow you to attach behavior to elements in the DOM.
|
|
|
|
*
|
|
|
|
* {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
|
|
|
|
*
|
|
|
|
* A directive consists of a single directive annotation and a controller class. When the
|
|
|
|
* directive's `selector` matches
|
|
|
|
* elements in the DOM, the following steps occur:
|
|
|
|
*
|
|
|
|
* 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
|
|
|
|
* arguments.
|
|
|
|
* 2. Angular instantiates directives for each matched element using `ElementInjector` in a
|
|
|
|
* depth-first order,
|
|
|
|
* as declared in the HTML.
|
|
|
|
*
|
|
|
|
* ## Understanding How Injection Works
|
|
|
|
*
|
|
|
|
* There are three stages of injection resolution.
|
|
|
|
* - *Pre-existing Injectors*:
|
|
|
|
* - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
|
|
|
|
* the dependency was
|
|
|
|
* specified as `@Optional`, returns `null`.
|
|
|
|
* - The platform injector resolves browser singleton resources, such as: cookies, title,
|
|
|
|
* location, and others.
|
|
|
|
* - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
|
|
|
|
* the same parent-child hierarchy
|
|
|
|
* as the component instances in the DOM.
|
|
|
|
* - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
|
|
|
|
* element has an `ElementInjector`
|
|
|
|
* which follow the same parent-child hierarchy as the DOM elements themselves.
|
|
|
|
*
|
|
|
|
* When a template is instantiated, it also must instantiate the corresponding directives in a
|
|
|
|
* depth-first order. The
|
|
|
|
* current `ElementInjector` resolves the constructor dependencies for each directive.
|
|
|
|
*
|
|
|
|
* Angular then resolves dependencies as follows, according to the order in which they appear in the
|
2016-07-28 06:31:26 -07:00
|
|
|
* {@link ComponentMetadata}:
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* 1. Dependencies on the current element
|
|
|
|
* 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
|
|
|
|
* 3. Dependencies on component injectors and their parents until it encounters the root component
|
|
|
|
* 4. Dependencies on pre-existing injectors
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* The `ElementInjector` can inject other directives, element-specific special objects, or it can
|
|
|
|
* delegate to the parent
|
|
|
|
* injector.
|
|
|
|
*
|
|
|
|
* To inject other directives, declare the constructor parameter as:
|
|
|
|
* - `directive:DirectiveType`: a directive on the current element only
|
|
|
|
* - `@Host() directive:DirectiveType`: any directive that matches the type between the current
|
|
|
|
* element and the
|
|
|
|
* Shadow DOM root.
|
|
|
|
* - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
|
|
|
|
* directives.
|
|
|
|
* - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
|
|
|
|
* child directives.
|
|
|
|
*
|
|
|
|
* To inject element-specific special objects, declare the constructor parameter as:
|
|
|
|
* - `element: ElementRef` to obtain a reference to logical element in the view.
|
|
|
|
* - `viewContainer: ViewContainerRef` to control child template instantiation, for
|
|
|
|
* {@link DirectiveMetadata} directives only
|
|
|
|
* - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
|
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* The following example demonstrates how dependency injection resolves constructor arguments in
|
|
|
|
* practice.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Assume this HTML template:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* <div dependency="1">
|
|
|
|
* <div dependency="2">
|
|
|
|
* <div dependency="3" my-directive>
|
|
|
|
* <div dependency="4">
|
|
|
|
* <div dependency="5"></div>
|
|
|
|
* </div>
|
|
|
|
* <div dependency="6"></div>
|
|
|
|
* </div>
|
|
|
|
* </div>
|
|
|
|
* </div>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* With the following `dependency` decorator and `SomeService` injectable class.
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Injectable()
|
|
|
|
* class SomeService {
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Directive({
|
|
|
|
* selector: '[dependency]',
|
|
|
|
* inputs: [
|
|
|
|
* 'id: dependency'
|
|
|
|
* ]
|
|
|
|
* })
|
|
|
|
* class Dependency {
|
|
|
|
* id:string;
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Let's step through the different ways in which `MyDirective` could be declared...
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* ### No injection
|
|
|
|
*
|
|
|
|
* Here the constructor is declared with no arguments, therefore nothing is injected into
|
|
|
|
* `MyDirective`.
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor() {
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* This directive would be instantiated with no dependencies.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* ### Component-level injection
|
|
|
|
*
|
|
|
|
* Directives can inject any injectable instance from the closest component injector or any of its
|
|
|
|
* parents.
|
|
|
|
*
|
|
|
|
* Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
|
|
|
|
* from the parent
|
|
|
|
* component's injector.
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor(someService: SomeService) {
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* This directive would be instantiated with a dependency on `SomeService`.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* ### Injecting a directive from the current element
|
|
|
|
*
|
|
|
|
* Directives can inject other directives declared on the current element.
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor(dependency: Dependency) {
|
|
|
|
* expect(dependency.id).toEqual(3);
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
* This directive would be instantiated with `Dependency` declared at the same element, in this case
|
|
|
|
* `dependency="3"`.
|
|
|
|
*
|
|
|
|
* ### Injecting a directive from any ancestor elements
|
|
|
|
*
|
|
|
|
* Directives can inject other directives declared on any ancestor element (in the current Shadow
|
|
|
|
* DOM), i.e. on the current element, the
|
|
|
|
* parent element, or its parents.
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor(@Host() dependency: Dependency) {
|
|
|
|
* expect(dependency.id).toEqual(2);
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* `@Host` checks the current element, the parent, as well as its parents recursively. If
|
|
|
|
* `dependency="2"` didn't
|
|
|
|
* exist on the direct parent, this injection would
|
|
|
|
* have returned
|
|
|
|
* `dependency="1"`.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* ### Injecting a live collection of direct child directives
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* A directive can also query for other child directives. Since parent directives are instantiated
|
|
|
|
* before child directives, a directive can't simply inject the list of child directives. Instead,
|
|
|
|
* the directive injects a {@link QueryList}, which updates its contents as children are added,
|
2015-11-23 16:02:19 -08:00
|
|
|
* removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
|
|
|
|
* `ngIf`, or an `ngSwitch`.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
|
|
|
|
* 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
|
|
|
|
*
|
|
|
|
* ### Injecting a live collection of descendant directives
|
|
|
|
*
|
|
|
|
* By passing the descendant flag to `@Query` above, we can include the children of the child
|
|
|
|
* elements.
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
|
|
|
|
*
|
|
|
|
* ### Optional injection
|
|
|
|
*
|
|
|
|
* The normal behavior of directives is to return an error when a specified dependency cannot be
|
|
|
|
* resolved. If you
|
|
|
|
* would like to inject `null` on unresolved dependency instead, you can annotate that dependency
|
|
|
|
* with `@Optional()`.
|
|
|
|
* This explicitly permits the author of a template to treat some of the surrounding directives as
|
|
|
|
* optional.
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({ selector: '[my-directive]' })
|
|
|
|
* class MyDirective {
|
|
|
|
* constructor(@Optional() dependency:Dependency) {
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* This directive would be instantiated with a `Dependency` directive found on the current element.
|
|
|
|
* If none can be
|
|
|
|
* found, the injector supplies `null` instead of throwing an error.
|
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* Here we use a decorator directive to simply define basic tool-tip behavior.
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({
|
|
|
|
* selector: '[tooltip]',
|
|
|
|
* inputs: [
|
|
|
|
* 'text: tooltip'
|
|
|
|
* ],
|
|
|
|
* host: {
|
|
|
|
* '(mouseenter)': 'onMouseEnter()',
|
|
|
|
* '(mouseleave)': 'onMouseLeave()'
|
|
|
|
* }
|
|
|
|
* })
|
|
|
|
* class Tooltip{
|
|
|
|
* text:string;
|
|
|
|
* overlay:Overlay; // NOT YET IMPLEMENTED
|
|
|
|
* overlayManager:OverlayManager; // NOT YET IMPLEMENTED
|
|
|
|
*
|
|
|
|
* constructor(overlayManager:OverlayManager) {
|
2016-06-30 07:16:43 +02:00
|
|
|
* this.overlayManager = overlayManager;
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
*
|
|
|
|
* onMouseEnter() {
|
|
|
|
* // exact signature to be determined
|
|
|
|
* this.overlay = this.overlayManager.open(text, ...);
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* onMouseLeave() {
|
|
|
|
* this.overlay.close();
|
|
|
|
* this.overlay = null;
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
* In our HTML template, we can then add this behavior to a `<div>` or any other element with the
|
|
|
|
* `tooltip` selector,
|
|
|
|
* like so:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* <div tooltip="some text here"></div>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Directives can also control the instantiation, destruction, and positioning of inline template
|
|
|
|
* elements:
|
|
|
|
*
|
|
|
|
* A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
|
|
|
|
* runtime.
|
|
|
|
* The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
|
|
|
|
* location in the current view
|
|
|
|
* where these actions are performed.
|
|
|
|
*
|
2016-07-28 06:31:26 -07:00
|
|
|
* Views are always created as children of the current {@link ComponentMetadata}, and as siblings of
|
|
|
|
* the
|
2015-10-12 10:12:11 -07:00
|
|
|
* `<template>` element. Thus a
|
|
|
|
* directive in a child view cannot inject the directive that created it.
|
|
|
|
*
|
|
|
|
* Since directives that create views via ViewContainers are common in Angular, and using the full
|
|
|
|
* `<template>` element syntax is wordy, Angular
|
|
|
|
* also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
|
|
|
|
* equivalent.
|
|
|
|
*
|
|
|
|
* Thus,
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* <ul>
|
|
|
|
* <li *foo="bar" title="text"></li>
|
|
|
|
* </ul>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Expands in use to:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* <ul>
|
|
|
|
* <template [foo]="bar">
|
|
|
|
* <li title="text"></li>
|
|
|
|
* </template>
|
|
|
|
* </ul>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
|
|
|
|
* the directive
|
|
|
|
* controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
|
|
|
|
*
|
|
|
|
* ## Lifecycle hooks
|
|
|
|
*
|
2016-07-07 23:02:35 -07:00
|
|
|
* When the directive class implements some {@linkDocs guide/lifecycle-hooks} the
|
2016-07-06 13:57:38 -07:00
|
|
|
* callbacks are called by the change detection at defined points in time during the life of the
|
|
|
|
* directive.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
|
|
|
|
*
|
|
|
|
* Here is a simple directive that triggers on an `unless` selector:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({
|
|
|
|
* selector: '[unless]',
|
|
|
|
* inputs: ['unless']
|
|
|
|
* })
|
|
|
|
* export class Unless {
|
|
|
|
* viewContainer: ViewContainerRef;
|
|
|
|
* templateRef: TemplateRef;
|
|
|
|
* prevCondition: boolean;
|
|
|
|
*
|
|
|
|
* constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
|
|
|
|
* this.viewContainer = viewContainer;
|
|
|
|
* this.templateRef = templateRef;
|
|
|
|
* this.prevCondition = null;
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* set unless(newCondition) {
|
|
|
|
* if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
|
|
|
|
* this.prevCondition = true;
|
|
|
|
* this.viewContainer.clear();
|
|
|
|
* } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
|
|
|
|
* this.prevCondition = false;
|
|
|
|
* this.viewContainer.create(this.templateRef);
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* We can then use this `unless` selector in a template:
|
|
|
|
* ```
|
|
|
|
* <ul>
|
|
|
|
* <li *unless="expr"></li>
|
|
|
|
* </ul>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Once the directive instantiates the child view, the shorthand notation for the template expands
|
|
|
|
* and the result is:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* <ul>
|
|
|
|
* <template [unless]="exp">
|
|
|
|
* <li></li>
|
|
|
|
* </template>
|
|
|
|
* <li></li>
|
|
|
|
* </ul>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Note also that although the `<li></li>` template still exists inside the `<template></template>`,
|
|
|
|
* the instantiated
|
|
|
|
* view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Directive: DirectiveMetadataFactory =
|
|
|
|
<DirectiveMetadataFactory>makeDecorator(DirectiveMetadata);
|
2015-05-04 11:11:22 -07:00
|
|
|
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-11-30 08:28:54 -08:00
|
|
|
* Specifies that a constant attribute value should be injected.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* The directive can inject constant string literals of host element attributes.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* Suppose we have an `<input>` element and want to know its `type`.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* ```html
|
|
|
|
* <input type="text">
|
2015-10-12 10:12:11 -07:00
|
|
|
* ```
|
2015-11-30 08:28:54 -08:00
|
|
|
*
|
|
|
|
* A decorator can inject string literal `text` like so:
|
|
|
|
*
|
|
|
|
* {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Attribute: AttributeMetadataFactory = makeParamDecorator(AttributeMetadata);
|
2015-07-07 08:15:58 +02:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from QueryMetadata.
|
2015-07-07 08:15:58 +02:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declares an injectable parameter to be a live list of directives or variable
|
|
|
|
* bindings from the content children of a directive.
|
|
|
|
*
|
|
|
|
* ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
|
|
|
|
*
|
|
|
|
* Assume that `<tabs>` component would like to get a list its children `<pane>`
|
|
|
|
* components as shown in this example:
|
|
|
|
*
|
|
|
|
* ```html
|
|
|
|
* <tabs>
|
|
|
|
* <pane title="Overview">...</pane>
|
2016-04-25 19:52:24 -07:00
|
|
|
* <pane *ngFor="let o of objects" [title]="o.title">{{o.text}}</pane>
|
2015-10-12 10:12:11 -07:00
|
|
|
* </tabs>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* The preferred solution is to query for `Pane` directives using this decorator.
|
|
|
|
*
|
|
|
|
* ```javascript
|
|
|
|
* @Component({
|
|
|
|
* selector: 'pane',
|
|
|
|
* inputs: ['title']
|
|
|
|
* })
|
|
|
|
* class Pane {
|
|
|
|
* title:string;
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'tabs',
|
|
|
|
* template: `
|
|
|
|
* <ul>
|
2016-04-25 19:52:24 -07:00
|
|
|
* <li *ngFor="let pane of panes">{{pane.title}}</li>
|
2015-10-12 10:12:11 -07:00
|
|
|
* </ul>
|
2016-01-01 12:44:20 +09:00
|
|
|
* <ng-content></ng-content>
|
2015-10-12 10:12:11 -07:00
|
|
|
* `
|
|
|
|
* })
|
|
|
|
* class Tabs {
|
|
|
|
* panes: QueryList<Pane>;
|
|
|
|
* constructor(@Query(Pane) panes:QueryList<Pane>) {
|
|
|
|
* this.panes = panes;
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* A query can look for variable bindings by passing in a string with desired binding symbol.
|
|
|
|
*
|
|
|
|
* ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
|
|
|
|
* ```html
|
|
|
|
* <seeker>
|
|
|
|
* <div #findme>...</div>
|
|
|
|
* </seeker>
|
|
|
|
*
|
2016-04-07 14:34:22 +02:00
|
|
|
* @Component({ selector: 'seeker' })
|
2015-10-12 10:12:11 -07:00
|
|
|
* class seeker {
|
|
|
|
* constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* In this case the object that is injected depend on the type of the variable
|
|
|
|
* binding. It can be an ElementRef, a directive or a component.
|
|
|
|
*
|
|
|
|
* Passing in a comma separated list of variable bindings will query for all of them.
|
|
|
|
*
|
|
|
|
* ```html
|
|
|
|
* <seeker>
|
2015-12-10 08:00:56 -08:00
|
|
|
* <div #findMe>...</div>
|
|
|
|
* <div #findMeToo>...</div>
|
2015-10-12 10:12:11 -07:00
|
|
|
* </seeker>
|
|
|
|
*
|
|
|
|
* @Component({
|
2016-04-07 14:34:22 +02:00
|
|
|
* selector: 'seeker'
|
2015-10-12 10:12:11 -07:00
|
|
|
* })
|
|
|
|
* class Seeker {
|
|
|
|
* constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Configure whether query looks for direct children or all descendants
|
|
|
|
* of the querying element, by using the `descendants` parameter.
|
|
|
|
* It is set to `false` by default.
|
|
|
|
*
|
|
|
|
* ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
|
|
|
|
* ```html
|
|
|
|
* <container #first>
|
|
|
|
* <item>a</item>
|
|
|
|
* <item>b</item>
|
|
|
|
* <container #second>
|
|
|
|
* <item>c</item>
|
|
|
|
* </container>
|
|
|
|
* </container>
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* When querying for items, the first container will see only `a` and `b` by default,
|
|
|
|
* but with `Query(TextDirective, {descendants: true})` it will see `c` too.
|
|
|
|
*
|
|
|
|
* The queried directives are kept in a depth-first pre-order with respect to their
|
|
|
|
* positions in the DOM.
|
|
|
|
*
|
|
|
|
* Query does not look deep into any subcomponent views.
|
|
|
|
*
|
|
|
|
* Query is updated as part of the change-detection cycle. Since change detection
|
|
|
|
* happens after construction of a directive, QueryList will always be empty when observed in the
|
|
|
|
* constructor.
|
|
|
|
*
|
|
|
|
* The injected object is an unmodifiable live list.
|
|
|
|
* See {@link QueryList} for more details.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @deprecated
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-07-07 08:15:58 +02:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Query: QueryMetadataFactory = makeParamDecorator(QueryMetadata);
|
2015-07-10 10:30:31 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildrenMetadata.
|
2015-09-17 18:45:14 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Configures a content query.
|
|
|
|
*
|
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 17:04:36 -08:00
|
|
|
* Content queries are set before the `ngAfterContentInit` callback is called.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({
|
|
|
|
* selector: 'someDir'
|
|
|
|
* })
|
|
|
|
* class SomeDir {
|
|
|
|
* @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
|
|
|
|
*
|
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 17:04:36 -08:00
|
|
|
* ngAfterContentInit() {
|
2015-10-12 10:12:11 -07:00
|
|
|
* // contentChildren is set
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-17 18:45:14 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var ContentChildren: ContentChildrenMetadataFactory =
|
|
|
|
makePropDecorator(ContentChildrenMetadata);
|
2015-09-17 18:45:14 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildMetadata.
|
2015-09-19 18:39:35 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Configures a content query.
|
|
|
|
*
|
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 17:04:36 -08:00
|
|
|
* Content queries are set before the `ngAfterContentInit` callback is called.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Directive({
|
|
|
|
* selector: 'someDir'
|
|
|
|
* })
|
|
|
|
* class SomeDir {
|
|
|
|
* @ContentChild(ChildDirective) contentChild;
|
2016-02-18 22:54:53 +01:00
|
|
|
* @ContentChild('container_ref') containerChild
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 17:04:36 -08:00
|
|
|
* ngAfterContentInit() {
|
2015-10-12 10:12:11 -07:00
|
|
|
* // contentChild is set
|
2016-02-18 22:54:53 +01:00
|
|
|
* // containerChild is set
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
2016-04-03 08:34:44 +09:00
|
|
|
*
|
2016-02-18 22:54:53 +01:00
|
|
|
* ```html
|
|
|
|
* <container #container_ref>
|
|
|
|
* <item>a</item>
|
|
|
|
* <item>b</item>
|
|
|
|
* </container>
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-19 18:39:35 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var ContentChild: ContentChildMetadataFactory = makePropDecorator(ContentChildMetadata);
|
2015-09-19 18:39:35 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildrenMetadata.
|
2015-09-17 18:45:14 -07:00
|
|
|
/**
|
2016-02-19 15:31:27 +09:00
|
|
|
* Declares a list of child element references.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2016-04-13 16:03:30 -07:00
|
|
|
* Angular automatically updates the list when the DOM is updated.
|
2016-02-19 15:31:27 +09:00
|
|
|
*
|
|
|
|
* `ViewChildren` takes a argument to select elements.
|
|
|
|
*
|
|
|
|
* - If the argument is a type, directives or components with the type will be bound.
|
|
|
|
*
|
2016-04-13 16:03:30 -07:00
|
|
|
* - If the argument is a string, the string is interpreted as a list of comma-separated selectors.
|
|
|
|
* For each selector, an element containing the matching template variable (e.g. `#child`) will be
|
|
|
|
* bound.
|
2016-02-19 15:31:27 +09:00
|
|
|
*
|
|
|
|
* View children are set before the `ngAfterViewInit` callback is called.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
2016-02-19 15:31:27 +09:00
|
|
|
* With type selector:
|
|
|
|
*
|
2015-10-12 10:12:11 -07:00
|
|
|
* ```
|
|
|
|
* @Component({
|
2016-02-19 15:31:27 +09:00
|
|
|
* selector: 'child-cmp',
|
|
|
|
* template: '<p>child</p>'
|
2015-10-12 10:12:11 -07:00
|
|
|
* })
|
2016-02-19 15:31:27 +09:00
|
|
|
* class ChildCmp {
|
|
|
|
* doSomething() {}
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'some-cmp',
|
|
|
|
* template: `
|
|
|
|
* <child-cmp></child-cmp>
|
|
|
|
* <child-cmp></child-cmp>
|
|
|
|
* <child-cmp></child-cmp>
|
|
|
|
* `,
|
|
|
|
* directives: [ChildCmp]
|
|
|
|
* })
|
|
|
|
* class SomeCmp {
|
|
|
|
* @ViewChildren(ChildCmp) children:QueryList<ChildCmp>;
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 17:04:36 -08:00
|
|
|
* ngAfterViewInit() {
|
2016-02-19 15:31:27 +09:00
|
|
|
* // children are set
|
|
|
|
* this.children.toArray().forEach((child)=>child.doSomething());
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
2016-02-19 15:31:27 +09:00
|
|
|
*
|
|
|
|
* With string selector:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Component({
|
|
|
|
* selector: 'child-cmp',
|
|
|
|
* template: '<p>child</p>'
|
|
|
|
* })
|
|
|
|
* class ChildCmp {
|
|
|
|
* doSomething() {}
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'some-cmp',
|
|
|
|
* template: `
|
|
|
|
* <child-cmp #child1></child-cmp>
|
|
|
|
* <child-cmp #child2></child-cmp>
|
|
|
|
* <child-cmp #child3></child-cmp>
|
|
|
|
* `,
|
|
|
|
* directives: [ChildCmp]
|
|
|
|
* })
|
|
|
|
* class SomeCmp {
|
|
|
|
* @ViewChildren('child1,child2,child3') children:QueryList<ChildCmp>;
|
|
|
|
*
|
|
|
|
* ngAfterViewInit() {
|
|
|
|
* // children are set
|
|
|
|
* this.children.toArray().forEach((child)=>child.doSomething());
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* See also: [ViewChildrenMetadata]
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-17 18:45:14 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var ViewChildren: ViewChildrenMetadataFactory = makePropDecorator(ViewChildrenMetadata);
|
2015-07-10 10:30:31 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildMetadata.
|
2015-07-10 10:30:31 -07:00
|
|
|
/**
|
2016-04-13 16:03:30 -07:00
|
|
|
* Declares a reference to a child element.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2016-02-19 15:31:27 +09:00
|
|
|
* `ViewChildren` takes a argument to select elements.
|
|
|
|
*
|
|
|
|
* - If the argument is a type, a directive or a component with the type will be bound.
|
|
|
|
*
|
2016-04-13 16:03:30 -07:00
|
|
|
* - If the argument is a string, the string is interpreted as a selector. An element containing the
|
|
|
|
* matching template variable (e.g. `#child`) will be bound.
|
2016-02-19 15:31:27 +09:00
|
|
|
*
|
2016-04-13 16:03:30 -07:00
|
|
|
* In either case, `@ViewChild()` assigns the first (looking from above) element if there are
|
|
|
|
* multiple matches.
|
2016-02-19 15:31:27 +09:00
|
|
|
*
|
|
|
|
* View child is set before the `ngAfterViewInit` callback is called.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
2016-02-19 15:31:27 +09:00
|
|
|
* With type selector:
|
|
|
|
*
|
2015-10-12 10:12:11 -07:00
|
|
|
* ```
|
|
|
|
* @Component({
|
2016-02-19 15:31:27 +09:00
|
|
|
* selector: 'child-cmp',
|
|
|
|
* template: '<p>child</p>'
|
2015-10-12 10:12:11 -07:00
|
|
|
* })
|
2016-02-19 15:31:27 +09:00
|
|
|
* class ChildCmp {
|
|
|
|
* doSomething() {}
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'some-cmp',
|
|
|
|
* template: '<child-cmp></child-cmp>',
|
|
|
|
* directives: [ChildCmp]
|
|
|
|
* })
|
|
|
|
* class SomeCmp {
|
|
|
|
* @ViewChild(ChildCmp) child:ChildCmp;
|
|
|
|
*
|
|
|
|
* ngAfterViewInit() {
|
|
|
|
* // child is set
|
|
|
|
* this.child.doSomething();
|
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* With string selector:
|
|
|
|
*
|
|
|
|
* ```
|
|
|
|
* @Component({
|
|
|
|
* selector: 'child-cmp',
|
|
|
|
* template: '<p>child</p>'
|
|
|
|
* })
|
|
|
|
* class ChildCmp {
|
|
|
|
* doSomething() {}
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'some-cmp',
|
|
|
|
* template: '<child-cmp #child></child-cmp>',
|
|
|
|
* directives: [ChildCmp]
|
|
|
|
* })
|
|
|
|
* class SomeCmp {
|
|
|
|
* @ViewChild('child') child:ChildCmp;
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
refactor(lifecycle): prefix lifecycle methods with "ng"
BREAKING CHANGE:
Previously, components that would implement lifecycle interfaces would include methods
like "onChanges" or "afterViewInit." Given that components were at risk of using such
names without realizing that Angular would call the methods at different points of
the component lifecycle. This change adds an "ng" prefix to all lifecycle hook methods,
far reducing the risk of an accidental name collision.
To fix, just rename these methods:
* onInit
* onDestroy
* doCheck
* onChanges
* afterContentInit
* afterContentChecked
* afterViewInit
* afterViewChecked
* _Router Hooks_
* onActivate
* onReuse
* onDeactivate
* canReuse
* canDeactivate
To:
* ngOnInit,
* ngOnDestroy,
* ngDoCheck,
* ngOnChanges,
* ngAfterContentInit,
* ngAfterContentChecked,
* ngAfterViewInit,
* ngAfterViewChecked
* _Router Hooks_
* routerOnActivate
* routerOnReuse
* routerOnDeactivate
* routerCanReuse
* routerCanDeactivate
The names of lifecycle interfaces and enums have not changed, though interfaces
have been updated to reflect the new method names.
Closes #5036
2015-11-16 17:04:36 -08:00
|
|
|
* ngAfterViewInit() {
|
2016-02-19 15:31:27 +09:00
|
|
|
* // child is set
|
|
|
|
* this.child.doSomething();
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
2016-02-19 15:31:27 +09:00
|
|
|
* See also: [ViewChildMetadata]
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-19 18:39:35 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var ViewChild: ViewChildMetadataFactory = makePropDecorator(ViewChildMetadata);
|
2015-09-19 18:39:35 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from ViewQueryMetadata.
|
2015-09-19 18:39:35 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Similar to {@link QueryMetadata}, but querying the component view, instead of
|
|
|
|
* the content children.
|
|
|
|
*
|
|
|
|
* ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
|
|
|
|
*
|
|
|
|
* ```javascript
|
2016-03-08 13:36:48 -08:00
|
|
|
* @Component({
|
|
|
|
* ...,
|
2015-10-12 10:12:11 -07:00
|
|
|
* template: `
|
|
|
|
* <item> a </item>
|
|
|
|
* <item> b </item>
|
|
|
|
* <item> c </item>
|
|
|
|
* `
|
|
|
|
* })
|
|
|
|
* class MyComponent {
|
|
|
|
* shown: boolean;
|
|
|
|
*
|
|
|
|
* constructor(private @Query(Item) items:QueryList<Item>) {
|
2016-01-01 17:15:41 +09:00
|
|
|
* items.changes.subscribe(() => console.log(items.length));
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
* }
|
|
|
|
* ```
|
|
|
|
*
|
|
|
|
* Supports the same querying parameters as {@link QueryMetadata}, except
|
|
|
|
* `descendants`. This always queries the whole view.
|
|
|
|
*
|
|
|
|
* As `shown` is flipped between true and false, items will contain zero of one
|
|
|
|
* items.
|
|
|
|
*
|
|
|
|
* Specifies that a {@link QueryList} should be injected.
|
|
|
|
*
|
|
|
|
* The injected object is an iterable and observable live list.
|
|
|
|
* See {@link QueryList} for more details.
|
2016-05-25 15:00:05 -07:00
|
|
|
* @deprecated
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-07-10 10:30:31 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var ViewQuery: QueryMetadataFactory = makeParamDecorator(ViewQueryMetadata);
|
2015-08-07 11:41:38 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from PipeMetadata.
|
2015-08-07 11:41:38 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declare reusable pipe function.
|
|
|
|
*
|
2015-10-19 15:37:32 +01:00
|
|
|
* ### Example
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
2015-11-30 08:28:54 -08:00
|
|
|
* {@example core/ts/metadata/metadata.ts region='pipe'}
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-08-07 11:41:38 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Pipe: PipeMetadataFactory = <PipeMetadataFactory>makeDecorator(PipeMetadata);
|
2015-09-03 15:10:48 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from InputMetadata.
|
2015-09-03 15:10:48 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declares a data-bound input property.
|
2015-09-24 13:46:13 -07:00
|
|
|
*
|
2015-10-12 10:12:11 -07:00
|
|
|
* Angular automatically updates data-bound properties during change detection.
|
|
|
|
*
|
|
|
|
* `InputMetadata` takes an optional parameter that specifies the name
|
|
|
|
* used when instantiating a component in the template. When not provided,
|
|
|
|
* the name of the decorated property is used.
|
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
|
|
|
* The following example creates a component with two input properties.
|
|
|
|
*
|
|
|
|
* ```typescript
|
|
|
|
* @Component({
|
|
|
|
* selector: 'bank-account',
|
|
|
|
* template: `
|
|
|
|
* Bank Name: {{bankName}}
|
|
|
|
* Account Id: {{id}}
|
|
|
|
* `
|
|
|
|
* })
|
|
|
|
* class BankAccount {
|
|
|
|
* @Input() bankName: string;
|
|
|
|
* @Input('account-id') id: string;
|
|
|
|
*
|
|
|
|
* // this property is not bound, and won't be automatically updated by Angular
|
|
|
|
* normalizedBankName: string;
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'app',
|
|
|
|
* template: `
|
|
|
|
* <bank-account bank-name="RBC" account-id="4747"></bank-account>
|
|
|
|
* `,
|
|
|
|
* directives: [BankAccount]
|
|
|
|
* })
|
|
|
|
* class App {}
|
|
|
|
*
|
|
|
|
* bootstrap(App);
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-03 15:10:48 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Input: InputMetadataFactory = makePropDecorator(InputMetadata);
|
2015-09-03 15:10:48 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from OutputMetadata.
|
2015-09-03 15:10:48 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declares an event-bound output property.
|
2015-09-24 13:46:13 -07:00
|
|
|
*
|
2015-10-12 10:12:11 -07:00
|
|
|
* When an output property emits an event, an event handler attached to that event
|
|
|
|
* the template is invoked.
|
|
|
|
*
|
|
|
|
* `OutputMetadata` takes an optional parameter that specifies the name
|
|
|
|
* used when instantiating a component in the template. When not provided,
|
|
|
|
* the name of the decorated property is used.
|
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
|
|
|
* ```typescript
|
|
|
|
* @Directive({
|
|
|
|
* selector: 'interval-dir',
|
|
|
|
* })
|
|
|
|
* class IntervalDir {
|
|
|
|
* @Output() everySecond = new EventEmitter();
|
|
|
|
* @Output('everyFiveSeconds') five5Secs = new EventEmitter();
|
|
|
|
*
|
|
|
|
* constructor() {
|
2015-11-15 23:58:59 -08:00
|
|
|
* setInterval(() => this.everySecond.emit("event"), 1000);
|
|
|
|
* setInterval(() => this.five5Secs.emit("event"), 5000);
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'app',
|
|
|
|
* template: `
|
2016-01-22 17:37:04 +08:00
|
|
|
* <interval-dir (everySecond)="everySecond()" (everyFiveSeconds)="everyFiveSeconds()">
|
2015-10-12 10:12:11 -07:00
|
|
|
* </interval-dir>
|
|
|
|
* `,
|
|
|
|
* directives: [IntervalDir]
|
|
|
|
* })
|
|
|
|
* class App {
|
|
|
|
* everySecond() { console.log('second'); }
|
|
|
|
* everyFiveSeconds() { console.log('five seconds'); }
|
|
|
|
* }
|
|
|
|
* bootstrap(App);
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-03 15:10:48 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var Output: OutputMetadataFactory = makePropDecorator(OutputMetadata);
|
2015-09-04 14:07:16 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from HostBindingMetadata.
|
2015-09-04 14:07:16 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declares a host property binding.
|
|
|
|
*
|
|
|
|
* Angular automatically checks host property bindings during change detection.
|
|
|
|
* If a binding changes, it will update the host element of the directive.
|
|
|
|
*
|
|
|
|
* `HostBindingMetadata` takes an optional parameter that specifies the property
|
|
|
|
* name of the host element that will be updated. When not provided,
|
|
|
|
* the class property name is used.
|
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
|
|
|
* The following example creates a directive that sets the `valid` and `invalid` classes
|
2015-11-23 16:02:19 -08:00
|
|
|
* on the DOM element that has ngModel directive on it.
|
2015-10-12 10:12:11 -07:00
|
|
|
*
|
|
|
|
* ```typescript
|
2015-11-23 16:02:19 -08:00
|
|
|
* @Directive({selector: '[ngModel]'})
|
2015-10-12 10:12:11 -07:00
|
|
|
* class NgModelStatus {
|
|
|
|
* constructor(public control:NgModel) {}
|
2016-04-26 18:38:52 -07:00
|
|
|
* @HostBinding('class.valid') get valid() { return this.control.valid; }
|
|
|
|
* @HostBinding('class.invalid') get invalid() { return this.control.invalid; }
|
2015-10-12 10:12:11 -07:00
|
|
|
* }
|
|
|
|
*
|
|
|
|
* @Component({
|
|
|
|
* selector: 'app',
|
2015-11-23 16:02:19 -08:00
|
|
|
* template: `<input [(ngModel)]="prop">`,
|
2015-10-12 10:12:11 -07:00
|
|
|
* directives: [FORM_DIRECTIVES, NgModelStatus]
|
|
|
|
* })
|
|
|
|
* class App {
|
|
|
|
* prop;
|
|
|
|
* }
|
|
|
|
*
|
|
|
|
* bootstrap(App);
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-04 14:07:16 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var HostBinding: HostBindingMetadataFactory = makePropDecorator(HostBindingMetadata);
|
2015-09-04 14:07:16 -07:00
|
|
|
|
2015-10-12 10:12:11 -07:00
|
|
|
// TODO(alexeagle): remove the duplication of this doc. It is copied from HostListenerMetadata.
|
2015-09-04 14:07:16 -07:00
|
|
|
/**
|
2015-10-12 10:12:11 -07:00
|
|
|
* Declares a host listener.
|
|
|
|
*
|
|
|
|
* Angular will invoke the decorated method when the host element emits the specified event.
|
|
|
|
*
|
|
|
|
* If the decorated method returns `false`, then `preventDefault` is applied on the DOM
|
|
|
|
* event.
|
|
|
|
*
|
|
|
|
* ### Example
|
|
|
|
*
|
|
|
|
* The following example declares a directive that attaches a click listener to the button and
|
|
|
|
* counts clicks.
|
|
|
|
*
|
|
|
|
* ```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: `<button counting>Increment</button>`,
|
|
|
|
* directives: [CountClicks]
|
|
|
|
* })
|
|
|
|
* class App {}
|
|
|
|
*
|
|
|
|
* bootstrap(App);
|
|
|
|
* ```
|
2016-05-25 15:00:05 -07:00
|
|
|
* @stable
|
2016-06-15 06:58:57 -07:00
|
|
|
* @Annotation
|
2015-09-04 14:07:16 -07:00
|
|
|
*/
|
2016-04-13 17:05:17 -07:00
|
|
|
export var HostListener: HostListenerMetadataFactory = makePropDecorator(HostListenerMetadata);
|
2016-06-28 09:54:42 -07:00
|
|
|
|
|
|
|
/**
|
2016-07-18 03:50:31 -07:00
|
|
|
* Declares an ng module.
|
|
|
|
* @experimental
|
2016-06-28 09:54:42 -07:00
|
|
|
* @Annotation
|
|
|
|
*/
|
2016-07-18 03:50:31 -07:00
|
|
|
export var NgModule: NgModuleMetadataFactory =
|
|
|
|
<NgModuleMetadataFactory>makeDecorator(NgModuleMetadata);
|