【问题标题】:Injecting controllers as services in typescript/angular?在打字稿/角度注入控制器作为服务?
【发布时间】:2015-03-21 05:11:37
【问题描述】:

我需要在 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!";
    }
}

我试过了,但是 angular 用一个来打招呼

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

【问题讨论】:

    标签: javascript angularjs mvvm angularjs-scope typescript


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2016-04-28
      • 2016-04-27
      • 2016-03-08
      • 1970-01-01
      • 2018-07-18
      • 2018-10-18
      • 2015-07-19
      • 1970-01-01
      相关资源
      最近更新 更多