2017-01-29 2 views
1

Довольно часто мне нужно использовать поток входных значений в компоненте. Обычно я делаю это таким образом:Angular2. Расширение входного декоратора

export class UserComponent { 
    userId$ = new BehaviorSubject<number>(null); 
    @Input() set userId(value: number) { 
     this.userId$.next(value); 
    } 
} 

Интересно, есть ли способ, чтобы создать Input$ декоратора:

export class UserComponent { 
    @Input$() userId$ = new BehaviorSubject<number>(null); 
} 

ответ

2

Да, возможно, вы могли бы создать дополнительный декоратор, который заменит поле класса с геттер/сеттер, геттер вернется 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); 
      } 
     }); 
    } 
} 
+0

Выглядит отлично, спасибо. Можете ли вы уточнить, почему вы думаете, что он сломает AoT? –

+0

Проверка типа более строгое в режиме AOT и попытка присвоить значение строки, указанному в поле Subject , может не совпадать. Чтобы сохранить совместимость, имеет смысл создать декоратор для ввода автоматического привязки к существующему субъекту, то есть '@Input() @Reactive (x => x.subject) bool: boolean;' – kemsky

+0

Я вижу, спасибо –

Смежные вопросы