Angular 6-尝试将一个函数传递给另一个类中的函数

时间:2018-10-02 10:23:14

标签: angular typescript

我有一个表,在其中单击行上的按钮以更新行上的布尔字段。 然后,我想刷新表。 我下面是:

SaveItem-设置我要更新的值,然后将对象,id和一个函数传递给进行调用的函数。

editItem-进行调用并更新项目,但是我然后希望它运行传入的函数,这是下面的最后一个函数getItems,它将重新填充表所基于的对象。

使用

在editItem的最后一行失败
TypeError: getItems is not a function

有人可以告诉我我在做什么错吗?

SaveItem(flag: boolean) {
    this.item$.Published = flag;
    this.edit.editItem(this.item$, this.id, this.getItems(this.items$));
  }


editItem(item, id, getItems) {
    const url = this.apiUrl + '/tables/Items/' + id
    this.http.patch(url, item, httpOptions).subscribe((data) => getItems(data));
  }


getItems(itemList: Item[]): void{
  this.data.getItems()
  .subscribe(data => this.items$ = data);
}

1 个答案:

答案 0 :(得分:1)

您必须将回调声明为平面函数,而不是函数的结果。看到这个小窍门,您可以在Typescript Scratchpad by clicking here上运行它。我确实在适用的地方写了一些评论,例如“ //这是重要的改变”。

class Item {
    Published: boolean
}

class Observable {
    subscribe(callback: (data: Array<Item>) => any) {
        callback(new Array<Item>());
    }
}

class Test {

    apiUrl: string;
    http = {
        patch: (url, item, httpOptions) => { 
            return new Observable();
        }
    };
    item$ = new Item();
    items$: Item[];
    id: 'someid';
    edit = {
        editItem: (item: any, id: string, callback: (data: Item[]) => void) => {
            // THIS IS THE IMPORTANT CHANGE
            return this.editItem(item, id, callback);
        }
    }
    data = {
        getItems: () => { 
            return new Observable();
        }
    };

    editItem(item, id, getItems) {
        const httpOptions: any = {};
        const url = this.apiUrl + '/tables/Items/' + id
        this.http.patch(url, item, httpOptions).subscribe((data) => this.getItems(data));
    }

    getItems(itemList: Item[]): void {
        this.data.getItems()
            .subscribe(data => { this.items$ = data; alert("Hey! I got called"); });
    }

    SaveItem(flag: boolean) {
        this.item$.Published = flag;
        // THIS IS THE IMPORTANT CHANGE
        this.edit.editItem(this.item$, this.id, this.getItems);
    }
}

let test = new Test();
test.SaveItem(true);