2017-04-09 65 views
1

我想通过从Firebase数据库获取项目并将其推送到列表来填充列表。经过大量的搜索,我在我的代码中达到了这一点:如何解决“_这是未定义”在角2

this.angFire.database.list('/SpareParts', { 
    query: { 
    orderByChild: '', 
    limitToFirst: this.limit // this is a BehaviorSubject<number>(3) 
    } 
}).subscribe(items => items.forEach(item => function f(j) { 
    setTimeout(() => { 
    console.log('timeout'); 
    this.items.push(item); 
    if (--j) f(j); 
    }, 3000) 
}.bind(this)(3))); 

在这里,我只抓取3个Firebase项目。代码的工作方式。它穿过的setTimeout,推动三个项目在列表中的同一时间,它完成后,它与错误崩溃:

_this is undefined

在此之前,我是收到错误

this is undefined

所以我用.bind函数仍然没有工作。

任何意见,将不胜感激。谢谢。

+0

函数f(j)的应该是(J)=> {}由于实际阻止您能够访问这个 – Sorikairo

+0

@Sorikairo通过改变函数f(j)至(j)=> {}我不能再有自我调用功能,因此我可能不得不改变代码的所有部分,这是我无法想象的。 – drdream100

+0

@ drdream100所有这一切都感觉很腥。你为什么要在setTimeout中包装呢?不,我没有看到你认为你能够重新调用f,因为它是一个已经被调用的回调函数。 –

回答

0

将此存储为函数外的变量,并使用该引用来引用您的组件。

var self = this; // <-- store here 
this.angFire.database.list('/SpareParts', { 
    query: { 
    orderByChild: '', 
    limitToFirst: this.limit // this is a BehaviorSubject<number>(3) 
    } 
}).subscribe(items => items.forEach(item => function f(j) { 
    setTimeout(() => { 
    console.log('timeout'); 
    self.items.push(item); // <-- use here 
    if (--j) f(j); 
    }, 3000) 
}.bind(this)(3))); 
+0

由于某种原因,这首先给了我“自己是未定义的”错误。但是在重建代码之后,它按预期工作!我不知道为什么会发生。非常感谢你!! – drdream100

+0

@ drdream100啊很高兴它解决了:-) – echonax

相关问题