Angular在单击回调函数中调用另一个函数(this)

时间:2018-04-10 08:30:27

标签: angular angular-material angular-material2

我认为这个问题与关键字“#34;这个"没有被分配到我认为的那样。

我正在使用Angular 5和WordCloud包。 https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md

有一个单击回调函数,它返回在回调中单击的单词的单个字符串。当用户点击我需要它来调用另一个函数并显示模态时。

component.ts

import { Component, OnInit, Input } from '@angular/core';
const WordCloud = require('wordcloud');

import { MatDialog, MAT_DIALOG_DATA } from '@angular/material';
import { TopWordsModalComponent } from './top-words-modal/top-words-modal.component';

@Component({
    selector: 'app-top-words',
    templateUrl: './top-words.component.html',
    styleUrls: ['./top-words.component.scss']
})

export class TopWordsComponent implements OnInit {

    @Input() report;
    categories: any = null;
    filterForm: FormGroup;

    constructor(private fb: FormBuilder, public modal: MatDialog) {

    }

    ngOnInit() {

        const all_words = this.report.activity.top_words;

        this.generateWordCloud(all_words);

    }

    generateWordCloud(words) {

        WordCloud(document.getElementById('word_cloud'), {

            list: words,
            click: function (data) {
                console.log(this);
                this.openModal(data);
            },
            classes: ['clickable']

        });
    }

    openModal(word) {

        this.modal.open(TopWordsModalComponent, {

            width: '1020px',
            data: { report: this.report, word: word }

        });

    }


}

但是当它试图调用this.openModal()时,我收到以下错误:

  

core.js:1448 ERROR TypeError:this.openModal不是函数       at Object.click(top-words.component.ts:79)       在HTMLDivElement.wordcloudclick(wordcloud2.js:440)       在ZoneDelegate.invokeTask(zone.js:421)       at Object.onInvokeTask(core.js:4740)       在ZoneDelegate.invokeTask(zone.js:420)       在Zone.runTask(zone.js:188)       在ZoneTask.invokeTask [作为调用](zone.js:496)       at invokeTask(zone.js:1517)       在HTMLDivElement.globalZoneAwareCallback(zone.js:1543)

并且console.log给出了单词object。

{list: Array(100), fontFamily: "Times, serif", fontWeight: "normal", color: ƒ, minSize: 0, …}

你能看到它是如何引用"对象点击"我相信"这个"属性被分配给回调对象而不是我的组件,所以我无法调用另一个函数。

这里有什么解决方案?

1 个答案:

答案 0 :(得分:4)

使用arrow function,即 () => ,而不是 function 关键字。使用 function 关键字的方法有自己的 this 上下文,并隐藏对类属性/方法的访问权限,而不是箭头函数。

如Mozilla Web Docs所述:

  

箭头函数表达式的语法短于函数   表达式并没有自己的this,arguments,super或者   new.target。这些函数表达式最适合非方法   函数,它们不能用作构造函数。

将您的代码更改为以下内容:

generateWordCloud(words) {
    WordCloud(document.getElementById('word_cloud'), {
        list: words,
        click: (data) => {
            console.log(this);
            this.openModal(data);
        },
        classes: ['clickable']
    });
}