@@ -3,13 +3,14 @@ import {Math} from 'angular2/src/facade/math';
33import { List , ListWrapper , MapWrapper } from 'angular2/src/facade/collection' ;
44import { Injector , Key , Dependency , bind , Binding , NoProviderError , ProviderError , CyclicDependencyError } from 'angular2/di' ;
55import { Parent , Ancestor } from 'angular2/src/core/annotations/visibility' ;
6- import { EventEmitter } from 'angular2/src/core/annotations/events ' ;
6+ import { EventEmitter , PropertySetter } from 'angular2/src/core/annotations/di ' ;
77import { View , ProtoView } from 'angular2/src/core/compiler/view' ;
88import { LightDom , SourceLightDom , DestinationLightDom } from 'angular2/src/core/compiler/shadow_dom_emulation/light_dom' ;
99import { ViewContainer } from 'angular2/src/core/compiler/view_container' ;
1010import { NgElement } from 'angular2/src/core/dom/element' ;
1111import { Directive , onChange , onDestroy } from 'angular2/src/core/annotations/annotations'
1212import { BindingPropagationConfig } from 'angular2/src/core/compiler/binding_propagation_config'
13+ import { Reflector } from 'angular2/src/reflection/reflection' ;
1314
1415var _MAX_DIRECTIVE_CONSTRUCTION_COUNTER = 10 ;
1516
@@ -90,18 +91,22 @@ class TreeNode {
9091export class DirectiveDependency extends Dependency {
9192 depth :int ;
9293 eventEmitterName :string ;
94+ propSetterName :string ;
9395
9496 constructor ( key :Key , asPromise :boolean , lazy :boolean , optional :boolean ,
95- properties :List , depth :int , eventEmitterName : string ) {
97+ properties :List , depth :int , eventEmitterName : string , propSetterName : string ) {
9698 super ( key , asPromise , lazy , optional , properties ) ;
9799 this . depth = depth ;
98100 this . eventEmitterName = eventEmitterName ;
101+ this . propSetterName = propSetterName ;
99102 }
100103
101104 static createFrom ( d :Dependency ) :Dependency {
102105 return new DirectiveDependency ( d . key , d . asPromise , d . lazy , d . optional ,
103106 d . properties , DirectiveDependency . _depth ( d . properties ) ,
104- DirectiveDependency . _eventEmitterName ( d . properties ) ) ;
107+ DirectiveDependency . _eventEmitterName ( d . properties ) ,
108+ DirectiveDependency . _propSetterName ( d . properties )
109+ ) ;
105110 }
106111
107112 static _depth ( properties ) :int {
@@ -119,6 +124,15 @@ export class DirectiveDependency extends Dependency {
119124 }
120125 return null ;
121126 }
127+
128+ static _propSetterName ( properties ) :string {
129+ for ( var i = 0 ; i < properties . length ; i ++ ) {
130+ if ( properties [ i ] instanceof PropertySetter ) {
131+ return properties [ i ] . propName ;
132+ }
133+ }
134+ return null ;
135+ }
122136}
123137
124138export class DirectiveBinding extends Binding {
@@ -256,8 +270,9 @@ export class ProtoElementInjector {
256270 }
257271 }
258272
259- instantiate ( parent :ElementInjector , host :ElementInjector , eventCallbacks ) :ElementInjector {
260- return new ElementInjector ( this , parent , host , eventCallbacks ) ;
273+ instantiate ( parent :ElementInjector , host :ElementInjector , eventCallbacks ,
274+ reflector : Reflector ) :ElementInjector {
275+ return new ElementInjector ( this , parent , host , eventCallbacks , reflector ) ;
261276 }
262277
263278 directParent ( ) : ProtoElementInjector {
@@ -311,7 +326,10 @@ export class ElementInjector extends TreeNode {
311326 _preBuiltObjects ;
312327 _constructionCounter ;
313328 _eventCallbacks ;
314- constructor ( proto :ProtoElementInjector , parent :ElementInjector , host :ElementInjector , eventCallbacks : Map ) {
329+ _refelector : Reflector ;
330+
331+ constructor ( proto :ProtoElementInjector , parent :ElementInjector , host :ElementInjector ,
332+ eventCallbacks : Map , reflector : Reflector ) {
315333 super ( parent ) ;
316334 if ( isPresent ( parent ) && isPresent ( host ) ) {
317335 throw new BaseException ( 'Only either parent or host is allowed' ) ;
@@ -324,6 +342,7 @@ export class ElementInjector extends TreeNode {
324342 }
325343
326344 this . _proto = proto ;
345+ this . _refelector = reflector ;
327346
328347 //we cannot call clearDirectives because fields won't be detected
329348 this . _preBuiltObjects = null ;
@@ -488,6 +507,7 @@ export class ElementInjector extends TreeNode {
488507
489508 _getByDependency ( dep :DirectiveDependency , requestor :Key ) {
490509 if ( isPresent ( dep . eventEmitterName ) ) return this . _buildEventEmitter ( dep ) ;
510+ if ( isPresent ( dep . propSetterName ) ) return this . _buildPropSetter ( dep ) ;
491511 return this . _getByKey ( dep . key , dep . depth , dep . optional , requestor ) ;
492512 }
493513
@@ -502,6 +522,13 @@ export class ElementInjector extends TreeNode {
502522 return ( _ ) => { } ;
503523 }
504524
525+ _buildPropSetter ( dep ) {
526+ var ngElement = this . _getPreBuiltObjectByKeyId ( StaticKeys . instance ( ) . ngElementId ) ;
527+ var domElement = ngElement . domElement ;
528+ var setter = this . _refelector . setter ( dep . propSetterName ) ;
529+ return function ( v ) { setter ( domElement , v ) } ;
530+ }
531+
505532 /*
506533 * It is fairly easy to annotate keys with metadata.
507534 * For example, key.metadata = 'directive'.
0 commit comments