2016-10-21 9 views
0

Ich habe diesen Codeblock, der die staatliche Komponente behandelt:Doppelte Werte innerhalb this.state.datasource

componentWillMount(){ 
    this.state = { 
     datasource: new ListView.DataSource({rowHasChanged: (row1, row2) => row1 !== row2}) 
    } 
    db.transaction((tx) => { 
     tx.executeSql("SELECT * FROM schedules", [], (tx, res) => { 
     let len = res.rows.length; 
     if(len > 0) { 
      for(let i = 0; i < len; i++) { 
      obj.push({id: res.rows.item(i)["id"], title: res.rows.item(i)["title"]}) 
      } 
      this.setState({ 
       datasource: this.state.datasource.cloneWithRows(obj) 
      }) 
      var data = this.state.datasource; 
      console.log(data); 
     } else { 
      console.log("empty") 
     } 
     }) 
    }, (err) => { 
     console.log("error: " + JSON.stringify(err)) 
    }) 
    } 

Es wirkt wie ein Zauber, wenn die App zum ersten Mal startet. Aber immer wenn ich die Seite erneut betrete, werden die Werte innerhalb der Datenquelle dupliziert. Sollte rowHasChanged: (row1, row2) => row1 !== row2 die ListView zwingen, sich nicht so zu verhalten oder fehlt mir eine Logik, die dem Code hinzugefügt werden muss?

Listview-Fehler Beispiel:

======================== 
| First title, id: 1 | 
======================== 
| Second title, id: 2 | 
======================== 
| First title, id: 1 | 
======================== 
| Second title, id: 2 | 

Wenn ich Konsole die Datenquelle ich diese Eigenschaft sah protokolliert: _cachedRowCount:15 Gibt es eine Möglichkeit native zu zwingen, reagieren nicht jedes Mal this.state.datasource und erneut ausführen cachen Die Seite wird geöffnet?

Antwort

0

landete ich durch das Leeren des obj Array wie so dass Problem zu lösen up:

db.transaction((tx) => { 
    tx.executeSql("SELECT * FROM schedules", [], (tx, res) => { 
    let len = res.rows.length; 
    if(len > 0) { 
     for(let i = 0; i < len; i++) { 
     obj.push({id: res.rows.item(i)["id"], title: res.rows.item(i)["title"]}) // Array that needs to be emptied 
     } 
     this.setState({ 
      datasource: this.state.datasource.cloneWithRows(obj) 
     }) 
     obj = [] // Done here 
    } 
    }) 
}, (err) => { 
    console.log("error: " + JSON.stringify(err)) 
})