成员在parseString方法中未定义

时间:2017-11-14 15:16:22

标签: xml angular

我有需要转换为Json的XML文件,所以我可以在我的应用程序中使用。在我的服务中,我返回XML文件:

constructor(private http: HttpClient) { }

loadXml() {
  return this.http.get('../../assets/1bbc5495-3872-4058-886e-aeee2a1cd52c.xml', { responseType: 'text' });
}

在我的组件中,我尝试获取XML文件中的数据:

parseString = require('xml2js').parseString;
data = [];

constructor(
  private _sharedService: SharedService
) {}

ngOnInit() {
  this.convertXmlToJson();
}

convertXmlToJson() {
  let data;
  this._sharedService.loadXml()
    .subscribe(
      res => {
        this.parseString(res, function (err, result) {
          this.data = result.rss.channel[0];
        });
      }
    )
}

这会导致错误:

  

无法设置属性'数据'未定义的

为什么我不能使用this.data

// EDIT。

这可能不是最好的方法,但它有效:

convertXmlToJson() {
  let data;
  this._sharedService.loadXml()
    .subscribe(
      res => {
        this.setData(res)
      }
    )
}

setData(res) {
  let data;
  this.parseString(res, function (err, result) {
    data = result.rss.channel[0]
  })
  this.data = data;
}

我现在将数据从服务中的方法传递给将函数存储在函数变量中的函数,并在类成员上设置该变量。

1 个答案:

答案 0 :(得分:0)

您在订阅的回复中丢失了上下文(convertXmlToJson() { let data; this._sharedService.loadXml() .subscribe( res => { this.parseString(res, (err, result) => this.data = result.rss.channel[0]).bind(this); } ) } )。

bind()

这就是为什么我们需要传递call()bind()

call()主要用于被称为回调的函数,function foo() { this.myBool = !this.myBool; } class MyClass { myBool = false; foo.call(this); // will read this.myBool because we are passing the context someSubscription.subscribe( resp => foo().bind(this) // being a callback function you need to pass the this context with a bind() ); } 用于超出范围的函数(不具有 this 上下文)但正在使用这个关键字。

示例:

import SimpleITK as sitk
resultImage = sitk.Elastix(sitk.ReadImage("fixedImage.nii"), sitk.ReadImage("movingImage.nii"))