从SERVICE执行COMPONENT方法 [英] Executing COMPONENT method from SERVICE

查看:73
本文介绍了从SERVICE执行COMPONENT方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从服务方法执行Component 方法。我看到了其他两个主题:

I'm trying to execute a Component method from a Service method. I saw these other 2 threads:

Link1 - 如何从服务中调用组件方法?

Link1 - How to call component method from service?

Link2 - Angular2从服务中调用组件

Link2 - Angular2 call a Component from a Service

但它们显示了从构造函数执行的方法。

But they show a method executed from the constructor.

我正在使用Ionic应用程序, Ion-Select组件(很多选择)对于它我正在使用一个功能调用Action Sheet,它为select中选择的每个选项都有一个回调处理程序。

I'm using on an Ionic app, the Ion-Select component(lot of selects) And for it I'm using a feature call Action Sheet which has a callback handler for every option chosen from the select.

Action在服务上,因此Handler调用。但每个select都有一个自己的方法需要从ActionSheet中调用。这就是我现在的代码:

The Action is on the service, and so the Handler call. But each select has an own method that need to be called from the ActionSheet. Thats my code now:

选择示例

import { Component, EventEmitter, Input, Output } from '@angular/core';
import { ActionSheetService } from '../../services/action-sheet.service';

import { Type } from '../../models/general/type.model';

@Component({
    selector: 'type-select-component',
    templateUrl: 'type-select.component.html',
    providers: [ ActionSheetService ]
})
export class TypeSelectComponent {

    @Input() public types: Object[];
    @Output() public typeId: EventEmitter<number> = new EventEmitter<number>();

    public updatedItem: Type = new Type();
    private actionTitle: string = "What's Type"

    constructor( private actionSheetService: ActionSheetService ) { }

    //The Service should execute this method
    public updateSelectItem(id:number, type: Type): void{
        this.updatedItem = type;
        this.typeId.emit(id);
    }

    public presentActionSheet(): void {
//calling the service method passing options for the action sheet 
this.actionSheetService.presentActionSheet(this.actionTitle,this.types as Type[]);
        }
    }

行动表服务

import { Injectable } from '@angular/core';
import { ActionSheetController } from 'ionic-angular'

@Injectable()
export class ActionSheetService {

constructor(private actionSheetCtrl: ActionSheetController) { }

public presentActionSheet(
    actionTitle: string, 
    items: any[]): void {

    let actionSheet = this.actionSheetCtrl.create({
        title: actionTitle
    });
    for (let i = 0; i < items.length; i++) {
        actionSheet.addButton({
            text: items[i].name,
            cssClass: items[i].css,
            icon: items[i].selectIcon,
            handler: () => {
//Here I should execute the method updateSelectItem from the component
                updateSelectItem(i, items[i]);
                console.log('Service ActionHandler');
            }
        });
    }
    actionSheet.addButton({ text: 'Cancel', 'role': 'cancel' });
    actionSheet.present();
    }
}

为什么我这样做? ?
好​​吧,我可以在每个选择中放一个动作表...但是它会打破DRY

Why am I doing this way??? Well I could put an action sheet in each select...But then it'll break DRY

任何帮助人员?

推荐答案

您可以将回调传递给您的服务并将其设置为操作表的处理程序。

You can pass a callback to your service and set it as handler for your action sheets.

public presentActionSheet(
    actionTitle: string, 
    items: any[],
    callbackHandler:any): void {

    let actionSheet = this.actionSheetCtrl.create({
        title: actionTitle
    });
    for (let i = 0; i < items.length; i++) {
        actionSheet.addButton({
            text: items[i].name,
            cssClass: items[i].css,
            icon: items[i].selectIcon,
            handler: () => {
                callbackHandler(i, items[i]);//call the handler passed
                console.log('Service ActionHandler');
            }
        });
    }
    actionSheet.addButton({ text: 'Cancel', 'role': 'cancel' });
    actionSheet.present();
    }

在您的组件中

public presentActionSheet(): void {
//calling the service method passing options for the action sheet 
this.actionSheetService.presentActionSheet(this.actionTitle,this.types as Type[],this.updateSelectItem.bind(this) );//send your component function. Do not forget to bind the context
        }

这篇关于从SERVICE执行COMPONENT方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆