はい、それは可能である、あなたがクラスフィールドに置き換えられます追加のデコレータを作成することができますが、 getter/setterペアの場合、getterはSubject
を返し、セッターはこのサブジェクトに対してnext
を実行します。
AOTコンパイルが破損する可能性がありますのでご注意ください。
@Input()
@Reactive(false)
public subject:Subject<boolean>; //you don't even need to initialize
export function Reactive(initialValue:any):Function
{
return function(target:Object, property:string)
{
const name:string = `__subject_${property}`;
Object.defineProperty(target, name, <PropertyDescriptor>{
enumerable : false,
configurable: false,
writable : true
});
Object.defineProperty(target, property, <PropertyDescriptor>{
enumerable : true,
configurable: false,
get : function():any
{
if(this[name] === undefined)
{
this[name] = new BehaviorSubject<any>(initialValue);
}
return this[name];
},
set : function(val:any):void
{
if(this[name] === undefined)
{
this[name] = new BehaviorSubject<any>(initialValue);
}
this[name].next(val);
}
});
}
}
お世話になります。あなたは、AoTを破ると思うのはなぜですか? –
タイプチェックはAOTモードではより厳しく、Subjectフィールドに文字列値を割り当てようとすると失敗する可能性があります。互換性を保つために、既存のサブジェクトへの自動バインディング入力用のデコレータを作成することは理にかなっています。つまり、 '@Input()@Reactive (x => x.subject)bool:boolean;' –
kemsky
ありがとう –