我正在尝试使用Parse作为Reactive Native应用程序中ListView的数据提供程序.我已经按照Parse指南关于订阅查询,但由于某些未知原因,数据源为空.我已经验证并编写了一个测试对象,Parse工作得很好.
似乎应该在getInitialState()之前调用observe()或者我错过了什么?
'use strict'; var React = require('react-native'); var Strings = require('./LocalizedStrings'); var Parse = require('parse').Parse; var ParseReact = require('parse-react'); Parse.initialize("api_key_here","api_key_here"); /* var TestObject = Parse.Object.extend("TestObject"); var testObject = new TestObject(); testObject.save({foo: "bar"}).then(function(object) { alert("yay! it worked"); }); */ var { View,Text,ListView,StyleSheet } = React; var styles = StyleSheet.create({ mainContainer: { flex: 1,padding: 30,marginTop: 65,flexDirection: 'column',justifyContent: 'center',backgroundColor: '#fff' },title: { marginBottom: 20,fontSize: 22,textAlign: 'center',color: '#000' },}); var ds = new ListView.DataSource({rowHasChanged: (r1,r2) => r1 !== r2}) // assumes immutable objects var WorkoutList = React.createClass({ mixins: [ParseReact.Mixin],observe: function() { return { workouts: (new Parse.Query("Workout")).descending("createdAt") }; },getInitialState: function() { return {dataSource: ds.cloneWithRows(this.data.workouts)} },renderRow: function() { return (<View><Text>Testing</Text></View>) },render: function() { return ( <View style = {{flex: 1,flexDirection: 'column'}}> {Strings.workoutsTabTitle} <ListView ref = "listview" dataSource = {this.state.dataSource} renderRow = {this.renderRow} automaticallyAdjustContentInsets = {false} keyboardDismissMode = "onDrag" keyboardShouldPersistTaps = {true} showsVerticalScrollIndicator = {true} style = {styles.mainContainer} /> </View> ) } }) module.exports = WorkoutList;
解决方法
我没有使用ParseReact,而是使用Parse Rest API从Parse获取数据.从componentDidMount调用以下代码.
fetch("https://api.parse.com/1/classes/Workout",{ headers: { "X-Parse-Application-Id": "Your application Id","X-Parse-REST-API-Key": "Your API Key" } }) .then((response) => response.json()) .then((responseData) => { this.setState({ dataSource: this.state.dataSource.cloneWithRows(responseData.results),loaded: true,}) }) .catch(function(error) { console.log(error) }) .done();