代码之家  ›  专栏  ›  技术社区  ›  BENBUN Coder

无法读取类内未定义方法调用的属性

  •  0
  • BENBUN Coder  · 技术社区  · 6 年前

    我有一个包含以下内容的typescript类

    getOrgList(oo: fhir.Organization) {
        var olist: orgRoles[] = [];
        var filtered = oo.extension.filter(this.getRoleExt);
    
        filtered.forEach(function (value) {
            var org = new orgRoles();
            value.extension.forEach(function (innerValue) {
                switch (innerValue.url) {
                    case 'role':
                        org.roleName = innerValue.valueCoding.display;
                        break;
                    case 'primaryRole':
                        org.primaryRole = innerValue.valueBoolean;
                        break;
                    case 'activePeriod':
                        var periodType = innerValue.valuePeriod.extension[0].valueString;
                        var periodExt = innerValue.valuePeriod;
                        var periodDisplay= this.getPeriodDisplay(periodExt);
                        break;
                    case 'status':
                        org.activeStatus = innerValue.valueString;
                        break;
                }
            });
    
            olist.push(org);
        });
    
        return olist;
    }
    

    这条线路目前故障

    var periodDisplay= this.getPeriodDisplay(periodExt);
    

    有错误

     ERROR TypeError: Cannot read property 'getPeriodDisplay' of undefined
    

    但是,getPeriodDisplay被定义为同一类中的下一个方法。

    getPeriodDisplay(pp) {
        return "++++";
    }
    

    我还有其他代码从类外部调用getPeriodDisplay(),但从类内的其他方法调用它似乎导致了问题

    我有什么办法解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dmitriy    6 年前

    您需要切换常规函数以使箭头函数能够访问正确的 this (类实例):

    getOrgList(oo: fhir.Organization) {
        var olist: orgRoles[] = [];
        var filtered = oo.extension.filter(this.getRoleExt);
    
        filtered.forEach((value) => {
            var org = new orgRoles();
            value.extension.forEach((innerValue) => {
                switch (innerValue.url) {
                    case 'role':
                        org.roleName = innerValue.valueCoding.display;
                        break;
                    case 'primaryRole':
                        org.primaryRole = innerValue.valueBoolean;
                        break;
                    case 'activePeriod':
                        var periodType = innerValue.valuePeriod.extension[0].valueString;
                        var periodExt = innerValue.valuePeriod;
                        var periodDisplay= this.getPeriodDisplay(periodExt);
                        break;
                    case 'status':
                        org.activeStatus = innerValue.valueString;
                        break;
                }
            });
    
            olist.push(org);
        });
    
        return olist;
    }