【问题标题】:Using a Provider in a Custom Class - Ionic 3在自定义类中使用提供程序 - Ionic 3
【发布时间】:2018-11-22 07:39:06
【问题描述】:

我正在尝试在我的 Ionic 3 项目中实现一些自定义类,以帮助以适当的 OOP 方式处理数据。但是,我认为我想要实现的实际上是 Angular 和 Ionic 设计模式的反模式。

对于每个用户,我想创建一个用户对象。我有一个名为provider 的提供程序,它执行一些http 调用。每个用户对象都可以使用一种方法来进行provider 的http 调用。

如果我像这样通过构造函数传递Provider,这可以正常工作:

export class User {

    //...various user attributes....

    constructor(payload, public provider: Provider){
        this.provider.doSomethingHttp(payload).subscribe(val => {
        // do something with response
        })
    }
}

如果我这样做是不行的:

export class User {

    //...various user attributes....
    public provider: Provider;

    constructor(payload){
        this.provider.doSomethingHttp(payload).subscribe(val => {
        // do something with response
        })
    }
}

提供者现在是undefined

为什么会这样?提供者必须通过构造函数传递吗?

另外,如果我在某处实例化一个新的User 类,我将不得不为提供者传递参数,这也不起作用。

let user = new User(payload, this.provider)

显然,似乎有一些更好的方法来处理这个问题。也许最好不要让一堆漂浮的对象在那里进行自己的 http 调用。

【问题讨论】:

    标签: angular typescript ionic-framework


    【解决方案1】:

    提供程序是由依赖注入创建的,要拥有它们的实例,您必须像第一个示例一样将它们添加到组件的构造函数中,并将其添加到应用模块提供程序。

    除了组件和提供者之外,我从未见过其他类中的提供者,我认为在您创建用户的地方(我假设是组件或提供者)您可以在构造函数中添加提供者,如果需要,将其传递给User 构造函数。

    其他选项是从User class 中删除提供程序,创建一个新的提供程序(我们称之为UserPrivider),它将在构造函数中添加第一个provider,并在这个新的UserProvider,实现一个创建用户的方法,创建后调用第一个提供者,以便每次需要创建用户时,注入UserProvider并调用该方法。

    【讨论】:

      【解决方案2】:

      “为什么会这样?”

      提供者是undefined,因为它从未被分配。

      export class User {
          constructor(payload, public provider: Provider) { }
      }
      

      是简写

      export class User {
          public provider: Provider;
          constructor(payload, provider: Provider) {
              this.provider = provider;
          }
      } 
      

      “必须通过构造函数传递提供者吗?”

      这是一种方式,但至少this.provider = 必须以某种方式发生。

      “显然,似乎有一些更好的方法来处理这个问题。也许最好不要让一堆漂浮的对象在那里进行自己的 http 调用。”

      就像@Octavio Garbarino 所说的那样,您通常会有一个服务来进行http 调用并以getUser(payload): User 方法返回User 实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        • 2017-11-01
        • 2021-10-29
        • 1970-01-01
        • 2016-06-05
        相关资源
        最近更新 更多