Как ссылаться на родительский параметр в аргументе дочерней функции? - PullRequest
1 голос
/ 07 августа 2020

В Angular 6.0.7 у меня есть родительский класс wj-flex-grid-parent.class.ts. У него есть параметр public m_wjcGridXlsx = wjcGrid.xlsx;. Я могу успешно ссылаться на этот параметр из моего дочернего компонента, используя this.m_wjcGridXlsx.

Одна функция в дочернем компоненте все еще вызывает у меня проблемы при попытке ссылаться на m_wjcGridXlsx в его аргумент:

public _exportFormatItem(args: m_wjcGridXlsx.XlsxFormatItemEventArgs) {
...
}

this.m_wjcGridXlsx выделяется intellisense и говорит: Cannot find namespace 'm_wjcGridXlsx' . Как я могу сослаться на параметр m_wjcGridXlsx здесь, в arg? Я пробовал добавить this. и self. безрезультатно.

Родительский компонент:

import { OnInit, ViewChild, AfterViewInit } from '@angular/core';
import * as wjcGridXlsx from 'wijmo/wijmo.grid.xlsx';
   
export class WjFlexGridParent implements OnInit
{    
    
    public m_wjcGridXlsx = wjcGridXlsx;    // the parameter giving me problems

...
}

Дочерний компонент:

import { Component, OnInit, Input, Output, OnChanges, SimpleChanges, ViewChild, EventEmitter, HostListener } from '@angular/core';
import { WjFlexGridParent } from '../fw/wijmo/wj-flex-grid-parent.class';

@Component({
    selector: '...',
    templateUrl: '...',
    styleUrls: ['...']
  })

  export class ChildComponent extends WjFlexGridParent implements OnChanges, OnInit {

    randomFunction() {  
     // this works, m_wjcGridXlsx is recognized:
     this.m_wjcGridXlsx.FlexGridXlsxConverter.saveAsync(this.m_grid, { includeColumnHeaders: true, includeCellStyles: false, formatItem: null }, strFileName);
    }


    // this doesn't work, m_wjcGridXlsx is not recognized:
    public _exportFormatItem(args: m_wjcGridXlsx.XlsxFormatItemEventArgs) { 
       ...
    }

  }
    

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

В вашем коде

import {
  Component, OnInit, Input, Output, OnChanges, SimpleChanges, ViewChild,
  EventEmitter, HostListener
} from '@angular/core';
import { WjFlexGridParent } from '../fw/wijmo/wj-flex-grid-parent.class';

@Component({
    selector: '...',
    templateUrl: '...',
    styleUrls: ['...']
})
export class ChildComponent extends WjFlexGridParent implements OnChanges, OnInit {
  _exportFormatItem(args: m_wjcGridXlsx.XlsxFormatItemEventArgs) {}
}

Вы используете необъявленный идентификатор, m_wjcGridXlsx. В области применения просто нет ничего с названием m_wjcGridXlsx. Вы действительно унаследовали свойство с именем m_wjcGridXlsx от WjFlexGridParent, но, как и в случае с любым другим свойством, вы должны соответствовать, в данном случае либо this, либо super.

Однако, если мы напишем

_exportFormatItem(args: this.m_wjcGridXlsx.XlsxFormatItemEventArgs) {}

this.m_wjcGridXlsx - значение, используемое там, где ожидается пространство имен.

Простое и идиоматическое решение c - импортировать тип и использовать его.

import {XlsxFormatItemEventArgs} from 'wijmo/wijmo.grid.xlsx';

export class ChildComponent {
  _exportFormatItem(args: XlsxFormatItemEventArgs) {}
}

Это совершенно не связано с наследованием, классами и свойствами. Он просто импортирует тип из модуля, чтобы мы могли использовать его для аннотирования значения, в данном случае параметр args.

Если вы предпочитаете, вы можете использовать импорт пространства имен модуля и ссылаться на тип, определенный с помощью псевдоним пространства имен, который вы создаете в операторе импорта.

import * as wijmo from 'wijmo/wijmo.grid.xlsx';

export class ChildComponent {
  _exportFormatItem(args: wijmo.XlsxFormatItemEventArgs) {}
}
1 голос
/ 07 августа 2020

Вы пытаетесь использовать значение экземпляра родительского класса в качестве типа. Вам необходимо либо сделать свойство statati c и использовать typeof для захвата типа, либо импортировать сам тип в дочерний класс.

Обратите внимание, что значение аргумента может быть передано из родительского класса, но информация о типе не обязательно должна поступать через родительский класс.

...