【问题标题】:Angular2 - reuse component with different services/providersAngular2 - 具有不同服务/提供者的重用组件
【发布时间】:2017-01-24 16:54:13
【问题描述】:

我正在开发一个应用程序,它具有用于后端的 Restful API 和用于前端的 Angular2。

我想在一个视图中有两个图表。比如说,一张图表是员工出勤率,另一张是产品销售图表。每个 API 都可用于从服务器获取数据。

我应该如何计划?

我是否应该有两个组件,一个是员工出勤,一个是产品销售,而这两个组件又会使用自己的服务并获取数据并填充组件?

我应该只有一个组件作为“图表”吗?在这种情况下如何获取数据?是否有任何关于服务的机制/良好实践来实现这一目标?

尝试在线搜索无法获得任何相关指南。

请帮忙。谢谢。

【问题讨论】:

    标签: angular service components


    【解决方案1】:

    这就是我的实现方式,更像是一种面向对象的方式。

    服务:

    export interface IGraphServices {
      getGraphData(): string;
    }
    
    @Injectable()
    export class EmployeeAttendanceService implements IGraphServices {
      getGraphData(): string {
        return "Employee Attendance Data";
      }
    }
    
    @Injectable()
    export class ProductSalesService implements IGraphServices {
      getGraphData(): string {
        return "Product Sales Data";
      }
    }
    

    组件:

    @Component({
      selector: 'graph',
      template: '<div>Graph component</div>'
    })
    export class GraphComponent implements OnInit {
      @Input('service') service: number;
    
      constructor(@Inject('IGraphServices')private providerService: IGraphServices[]) {
    
      }
    
      ngOnInit(): void {
        console.log(this.providerService[this.service].getGraphData());
      }
    }
    

    在你的 NgModule 提供者中:

    providers: [
        {
          provide: 'IGraphServices', useClass: EmployeeAttendanceService, multi: true
        },
        {
          provide: 'IGraphServices', useClass: ProductSalesService, multi: true
        }
    ]
    

    用法:

    <!-- EmployeeAttendanceService -->
    <graph [service]="0"></graph>
    
    <!-- ProductSalesService -->
    <graph [service]="1"></graph>
    

    【讨论】:

    • 这似乎是一个更好的方法。更少的重复,更紧凑,更模块化。我将在我的应用程序中采用这种风格。非常感谢 12 秒。
    【解决方案2】:

    如果您提供的信息很难回答构建两个不同或单个组件是否是个好主意。

    你可以

    • 在父级中注入服务并将其传递给图形组件的输入。

    • 将这两个服务注入到图形组件中,并将参数传递给一个输入,告诉图形组件使用哪个服务

    • 创建一项服务,为员工出勤和产品销售数据提供方法,并使用图形组件中的输入来告诉它应该使用什么方法。

    • 使用已注册您希望图形组件使用的提供程序的父组件。当图形组件注入服务时,它会获得父级提供的服务。

    @Component({
      input: 'my-graph',
      template: ' show the graph here '
    })
    class MyGraphComponent {
      @Input() data;
    }
    
    @Component({
      input: 'employee-attendance-graph',
      template: '<my-graph [data]="data"></my-graph>'
    })
    class EmployeeAttendanceGraph {
      constructor(private data:Service1) {}
    }
    
    @Component({
      input: 'product-sales-graph',
      template: '<my-graph [data]="data"></my-graph>'
    })
    class ProductSalesGraph {
      constructor(private data:Service2) {}
    }
    

    然后像这样使用它

    <employee-attendance-graph></employee-attendance-graph>
    <product-sales-graph></product-sales-graph>
    

    【讨论】:

    • 组件将具有相似的 GUI 和控件(图形类型、开始日期、结束日期和图例)。为了避免重复,我试图只使用一个组件,并且我想根据预期用途从不同的服务中注入数据。我的问题是如何实现这一目标?我喜欢您的第二个建议,但并不多,因为它要求更改后端。我们希望尽可能避免对后端进行更改。有没有办法从组件使用所需服务的前端将令牌传递给组件。谢谢甘特。
    • 我会创建 3 个组件。一个显示图形,一个用于将图形组件添加到视图的每种图形类型。在 &lt;employee-attendanc-graph&gt; 中注入 service1 并使用输入绑定将其传递给嵌套图组件,在 &lt;product-sales-graph&gt; 中注入 service2 并使用输入将其传递给嵌套图。
    • Gunter,可能是第四个选项不错。您能否进一步说明如何做到这一点。或者,如果您可以向我指出任何指导如何完成此操作的教程,将会很有帮助。谢谢。
    • 是的,我明白你的意思。谢谢你把它很好。我认为这回答了我的疑问。我会将其标记为已完成。但是,如果其他人觉得/知道一些更好的方法,请分享。非常感谢甘特。
    猜你喜欢
    • 1970-01-01
    • 2016-05-28
    • 2016-08-05
    • 2017-10-08
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多