我需要在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);
}
}
现在这很好用等等。但我想知道是否真的有必要创建一个单独的服务类并将其注入两个控制器只是为了共享一个简单的变量?是不是可以让1个控制器实现服务,然后将其注入另一个服务器?
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
答案 0 :(得分:1)
服务是全球单身人士。它们可以注入两个控制器,每个控制器将访问相同的服务,因此访问该服务中的相同变量。这与控制器不同。可以创建同一控制器的多个实例。
您无法使用DI注入控制器的特定实例。您可以将$ controller服务注入controller1,然后在controller1中创建controller2的实例。但那当然不是你想要的。它与包含您要访问的变量的控制器的实例不同。
不直接支持在两个控制器之间创建依赖关系的事实应该暗示这可能不是您想要做的事情。控制器应仅包含单个视图的业务逻辑。该文档明确指出它们不应该用于跨控制器共享状态。这样做不仅会使代码复杂化,还会使测试变得困难。