2016-05-17 47 views
0

在我的React-native应用程序中我试图在我的listenForItems函数中调用另一个函数,但不断收到错误this.populateArray is not a function. In 'this.populateArray(solutions)', this.populateArray is undefined.我在其他类中执行此操作,并且它正在工作,但出于某种原因,它在此处不起作用。有什么我失踪?在另一个函数内反应本地故障调用函数?

populateArray: function(solutions) { 
    var completed = []; 
    var inProgress; 

    for (var i = 0; i < solutions.length; i++) { 
     if (solutions[i].completed == 0) { 
      inProgress = solutions[i].id; 
     } 
     else { 
      completed.push(solutions[i].id); 
     } 
    } 
}, 

listenForItems: function(cluesRef) { 

    var solutions = []; 
    userSolutionsRef.orderByChild('user_id').startAt(0).endAt(0).once('value', function(snap){ 
     var solution = snap.val(); 
     for (var i = 0; i < solution.length; i++) { 
      if (solution[0].hunt_id == 0) { 
       solutions.push(solution[0]); 
      } 
     } 
     this.populateArray(solutions); 
    }); 
}, 

回答

3

JavaScript的经典范围问题。谷歌将帮助加深理解。简而言之,函数内的“this”一词指的是该函数。在这个例子中,它引用了您在userSolutionsRef.orderByChild中使用的匿名函数(回调函数)。有很多方法可以解决这个问题。您可以使用ES6(ES2015)箭头的功能在这种情况下,它变得像

userSolutionsRef.orderByChild('user_id').startAt(0).endAt(0).once('value', (snap) => { 
    var solution = snap.val(); 
    for (var i = 0; i < solution.length; i++) { 
     if (solution[0].hunt_id == 0) { 
      solutions.push(solution[0]); 
     } 
    } 
    this.populateArray(solutions); 
}); 

或ES5解决方案

var that = this; 
userSolutionsRef.orderByChild('user_id').startAt(0).endAt(0).once('value', function(snap){ 
     var solution = snap.val(); 
     for (var i = 0; i < solution.length; i++) { 
      if (solution[0].hunt_id == 0) { 
       solutions.push(solution[0]); 
      } 
     } 
     that.populateArray(solutions); 
    });