5

不知道我在这里缺少什么。

我需要得到datainto的输出this.contact。现在,我正在使用静态类变量,但必须这样做似乎很脏。

export class contactEdit {
  static t; // static class var
  constructor() {
    this.id = null;
    this.contact = null;
    contactEdit.t = this;
  }

  activate(id) {
    this.id = id;
    let contact = this.contact; // scoped version of class var
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      contactEdit.t.contact = data; // this works
      contact = data; // this doesn't
    });
  }
}

通常我会var contact在函数内部创建一个activate()(它在 Chrome 控制台中工作),但这似乎在 ES6 中不起作用。

铬控制台:

var c = null;
undefined
c;
null
dpd.contacts.get('a415fdc8f5a7184d').then(function(data) {
      c = data;
    });
Object {}fail: (n)then: (e,t)__proto__: Object
c;
Object {firstName: "John", lastName: "Doe", id: "a415fdc8f5a7184d"}
4

2 回答 2

24

你需要做两件事。首先,使用箭头函数,其次,使用 `this.contact = data;

activate(id) {
  this.id = id;
  return dpd.contacts.get(id).then(data => {
    console.log(data);
    this.contact = data;
  });
}

您使用箭头函数是因为它处理 JavaScript 的 " this" 问题,其中 this 指的是函数的词法范围,而不是您当前所在的对象。使用箭头函数可确保this箭头函数外部与this在箭头函数内部。

您需要使用this.contact因为contact是类的实例属性。

于 2016-07-26T15:09:29.963 回答
6

问题是contact = data;会更新局部contact变量的值,但不会改变this.contact. 您需要改为更新contact联系人属性。问题是您无权访问this匿名函数的内部(或者更确切地说,this匿名函数的 's 不会与 's 相同thisactivate

有不同的方法可以解决这个问题。

1-您可以将激活的上下文(this)保存到闭包中的变量中,activate以便您可以在then.

activate(id) {
    this.id = id;
    let that = this;
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      that.contact = data;
    });
  }

2-您可以将函数绑定到activate's this,以便使用相同的上下文调用它。

activate(id) {
    this.id = id;
    return dpd.contacts.get(id).then(function(data) {
      console.log(data);
      this.contact = data;
    }.bind(this));
  }

3-(在 ES6 中推荐)您可以使用箭头函数(箭头函数没有自己的上下文,因此它们保留创建它们的位置)

activate(id) {
    this.id = id;
    return dpd.contacts.get(id).then((data) => {
      console.log(data);
      this.contact = data;
    });
  }
于 2016-07-26T15:18:05.710 回答