繁体   English   中英

注入控制器作为打字稿/角?

[英]Injecting controllers as services in typescript/angular?

我需要在2个控制器之间共享数据。 为此,正如我在SO上了解到的那样,两个控制器之间必须有一个共同的契约-服务。

export interface IController1Service {
    sharedItem : any;
}

class Controller1Service implements IController1Service {
    sharedItem : any;
}

export class Controller1 {

    constructor(contract : IController1Service) {
        contract.sharedItem = "Hi Controller2!";
    }

}

export class Controller2 {

    constructor(contract: IController1Service) {
        alert(contract.sharedItem);
    }

}

现在一切正常,等等。但是我想知道是否真的有必要创建一个单独的服务类并将其注入两个控制器中以共享一个简单变量? 是否有可能让一个控制器实现该服务,然后将其注入另一个控制器?

export interface IController1Service {
    sharedItem: any;
}

export class Controller1 implements IController1Service {
    sharedItem: any;

    constructor() {
        this.sharedItem = "Hi Controller2!";
    }
}

我试过了,但是角度向我打招呼

Can't resolve dependency for controller MyApp.Controller2 with name MyServices.IController1Service

服务是全球单例。 可以将它们注入两个控制器中,并且每个控制器将访问相同的服务,因此将访问该服务中的相同变量。 这与控制器不同。 可以创建同一控制器的多个实例。

您不能使用DI注入控制器的特定实例。 您可以将$ controller服务注入controller1,然后在controller1中创建一个controller2的实例。 但这当然不是您想要的。 它不是包含要访问的变量的控制器的同一实例。

不直接支持在两个控制器之间创建依赖关系这一事实应表明这可能不是您想要执行的操作。 控制器应仅包含单个视图的业务逻辑。 该文档特别指出,不应将它们用于在控制器之间共享状态。 这样做不仅使您的代码复杂,而且使测试变得困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM