2

在我的 Angular 应用程序中,我有两个服务,一个处理 http 层,另一个只是一个路由守卫,用于实现canActivate与第一个服务的状态相关的方法。例如:

后端服务:

@Injectable()
export class BackendService {
    private data: any;
    constructor(private http: Http) {
        console.log('backend service constructor hit');
        this.data = 'initial';
    }
    getData() {
        console.log(this.data);
        return this.data;
    }
    setData(data) {
        // http stuff
        this.data = data;
    }
}

routeguard.service:

@Injectable()
export class RouteguardService implements CanActivate {
    constructor(private backendService: BackendService) { }
    canActivate() {
        return this.backendService.getData() !== 'initial';
    }
}

我相信我在错误的位置提供了其中一项服务?目前providers,我的app.module. 但是我可以通过 console.log 语句判断,backend.service当它作为路由的一部分被调用时与组件使用它时是分开的,所以数据是不同的,数据总是作为“初始”返回当在 canActivate 方法中检查时,尽管已将其设置为来自组件的其他内容。希望我清楚地解释了这一点,我对角度还是很陌生。

我是否需要在不同的位置提供其中一项服务,还是我完全做错了什么?感谢您的任何指示。

4

2 回答 2

1

我意识到问题是我不小心backend.service在根app.component提供程序中包含了 ,这意味着它的子组件将注入一个实例,但是我的路由文件中的一个实例是从app.module提供程序注入的,因此重复服务和数据差异.

因此,解决方案是从 中删除该服务,app.component并始终由其提供app.module

于 2017-09-21T18:39:12.063 回答
1

尝试将要设置的属性声明BackendServicestatic一个。然后使用 getter 和 setter 来访问它。不要在constructor服务中初始化它。

@Injectable()
export class BackendService {
    private static data: any = 'initial';
    constructor(private http: Http) {
        console.log('backend service constructor hit');
    }
    get data() {
        console.log(this.data);
        return BackendService.data;
    }
    set data(data: any) {
        // http stuff
        BackendService.data = data;
    }
}

然后,您可以data使用 getter 和 setter 在外部访问私有静态值。例如在canActivate守卫中,

@Injectable()
export class RouteguardService implements CanActivate {
    constructor(private backendService: BackendService) { }
    canActivate() {
        return this.backendService.data !== 'initial';
        // this.backendService.data <-- denotes getter
        // this.backendService.data = 'not-initial'; <-- denotes setter
    }
}

根据问题的理解,您在正确的地方提供服务。试试看这是否能解决问题。

于 2017-09-21T18:05:37.120 回答