2016-09-09 22 views
7

Jestem nowy w Angular 2, ale mam dobre doświadczenie w Angular 1.x.jak zaimplementować aop w kątowej 2

otrzymuję błąd: Nie można odnaleźć modułu 'aspect.js/dist/lib/aspekt'

Poniżej mój kod:

logging.aspect.ts

import {Injectable} from '@angular/core'; 
import {beforeMethod, Metadata} from 'aspect.js/dist/lib/aspect'; 
@Injectable() 
export class LogAspect { 

    @beforeMethod({ 
    classNamePattern: /(Matter|Customer)Service/, 
    methodNamePattern: /^(get)/ 
    }) 
    invokeBeforeMethod(meta: Metadata) { 
    console.log(`Inside of the logger. 
     Called ${meta.className}.${meta.method.name} 
     with args: ${meta.method.args.join(', ')}.` 
    ); 
    } 
} 

aspekt definiuje poradę, która jest stosowana do wszystkich wywołań metod zaczynających się od uzyskania w ramach klas zawierających wzór regex (Matter | Customer) w ich nazwie. Dostępna rad Metadane mogą zawierać rzeczywiste nazwy method- i klasa wraz z parametrami metoda wezwanie

invoice.service.ts

import {Injectable} from '@angular/core'; 
import {Http} from '@angular/http'; 
import {Observable} from 'rxjs/Observable'; 
import 'rxjs/Rx'; 
import {Wove} from 'aspect.js/dist/lib/aspect'; 
import {Matter} from './Matter.model'; 
@Injectable() 
@Wove() 
export class MatterService{ 
    private url: string; 
    constructor(private http: Http) { 
    this.url = '/data/matters/data.json'; 
    } 
    get(): Observable<Matter[]> { 
    return this.http.get(this.url) 
     .map(
     (response) => <Matter[]>response.json() 
    ); 
    } 
} 

I proszę sugerować jakikolwiek inny sposób w celu wdrożenia AOP w angular2

+0

Czy używasz nowego kompilatora AOT Angular 2? AOT łamie dekoratorów stron trzecich, które, jak sądzę, próbują rozwiązać. Działając pod JIT, moje niestandardowe dekoratory działają idealnie. Rozumiem, że dekoratory i AOP są ortogonalne, ale ponieważ używasz składni dekoratora, po prostu wiesz, że nie działa ona dobrze z AOT, ponieważ AOT usuwa dekoratory w procesie zwanym obniżaniem, w którym przekształca się je w statyczne metadane (mogło to być częściowo rozwiązane) . (witamy w AOT: TypeScript ze skasowanymi dekoratorami i próbującymi być reifikowanymi i nieudanymi-trudnymi-ponieważ-po-pomysłem-to-sutpid-in-JavaScript "typy") –

+0

Prawdopodobnie możesz otworzyć problem na https : //github.com/mgechev/aspect.js. Minko Gechev jest bardzo zaangażowany w Angular, jak również –

Odpowiedz

1

Czy próbowałeś już kaop-ts? Wydaje mi się, że jest to bardziej intuicyjne i działa dla mnie na projekt firmy

// LogAspect.ts 
import { Injectable } from '@angular/core' 
import { AdvicePool, adviceMetadata, IMetadata } from 'kaop-ts' 

@Injectable() 
export class LogAspect extends AdvicePool { 
    static log(@adviceMetadata meta: IMetadata) { 
    console.log('Called: ', meta.target) 
    console.log('Args: ', meta.args) 
    } 
} 

// YourService.ts 
import { Injectable } from '@angular/core' 
import { beforeMethod } from 'kaop-ts' 
import { LogAspect } from './LogAspect' 

@Injectable() 
export class YourService { 
    @beforeMethod(LogAspect.log) 
    get() { 
    // .... 
    } 
} 
+0

związanych: https://github.com/k1r0s/kaop-ts/issues/5 – k1r0s

Powiązane problemy