Как можно написать декоратор, который бы указанную функцию оборачивал бы в определённый код?

Как можно написать декоратор, который бы указанную функцию оборачивал бы в определённый код?

this.ngZone.runOutsideAngular(() => {
    ......Code.....
}

Что б выглядело как-то так

@RunOutsideAngular
myFunc() {
    mycode.....
}

а в итоге выполнялось бы так

myFunc() {
    this.ngZone.runOutsideAngular(() => {
        mycode.........
    }
}

И второй вопрос - можно ли обернуть весь класс, что б все функции класса оборачивались в обёртку?
  • Вопрос задан
  • 39 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Условно так:
const RunOutsideAngular = (target: any, memberName: string) => {
  const method = target[memberName];
  return Object.defineProperty(target, memberName, {
    writable: true,
    configurable: true,
    value(...args: any[]) {
        return this.ngZone.runOutsideAngular(method.bind(this, ...args))
    } 
  });
};

const RunOutsideAngularAll = (constructor: Function) => { 
    const keys = new Set<string>(); 
    let proto = constructor.prototype;

    do {
        if(proto === Object.prototype) break;

        Object.getOwnPropertyNames(proto).forEach(
            key => typeof proto[key] === 'function' 
                && key !== 'constructor'
                && keys.add(key)
        );
    } while (
        proto = Object.getPrototypeOf(proto)
    );

    keys.forEach(key => RunOutsideAngular(constructor.prototype, key));
}

class SomeClass {
    @RunOutsideAngular
    myFunc() {
        mycode.....
    }
}

// или

@RunOutsideAngularAll
class SomeClass {
    myFunc() {
        mycode.....
    }
}


RunOutsideAngular - по-хорошему надо типизировать дженериком под ангуляр.
RunOutsideAngularAll - обрабатывает все методы и функции, в т.ч. унаследованные, можно упростить чтоб работал только с методами текущего класса.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы