Реагировать на родную ссылку на ребенка не удалось - PullRequest
0 голосов
/ 24 февраля 2019

const { width: WIDTH } = Dimensions.get('window');
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth() + 1;
var yyyy = today.getFullYear();
if (dd < 10) {
    dd = '0' + dd;
}
if (mm < 10) {
    mm = '0' + mm;
}
today = mm + dd + yyyy;

class Attendance extends Component {
    state = {
        image: null,
        submit: false,
        loading: false,
        face: null,
        confidence: 0,
        class: '',
        flag: ''
    };
    async componentDidMount() {
        await Permissions.askAsync(Permissions.CAMERA);
        const { currentUser } = firebase.auth();
        firebase
         .database()
         .ref('users/')
         .child(currentUser.uid)
         .on('value', snap => 
            this.setState({ 
                face: snap.val().image,
                class: snap.val().stream_sem
            })
         );
    }
    render(){
        return(
            <View style={styles.Conatiner}>
                <Loader loading={this.state.loading} />
                {this.renderContent()}
            </View>
        );
    }
    renderContent = () =>  {
        firebase.database().ref('attendance')
        .child(this.state.class)
        .child(today)
        .on("value", snap => {
            this.setState({ flag: snap.val().flag});
        });
        if(this.state.flag === "0") {
            //**something**
        }
        else {
            //**something**
        }
    }
}

Когда я пытаюсь написать this.state.class, это означает, что ссылка на дочернего элемента не выполнена. Здесь - информация об ошибке, которую я получаю.Моя база данных Firebase Изображение здесь.Подскажите, пожалуйста, где я иду не так.Я хочу получить доступ к «флаговой» части базы данных.CSE8 должен совпадать с пользователями stream_sem Заранее благодарен

1 Ответ

0 голосов
/ 24 февраля 2019

Когда ваш renderContent вызывается в первый раз, ваш state.class - пустая строка, помните, что снимок с firebase будет загружен асинхронно.Кроме того, не присоединяйте слушателей к firebase в функции рендеринга, которая вызывается методом рендеринга, у вас будет много слушателей.

Ваша логика должна выглядеть примерно так:

  1. Получить пользовательские данные из firebase
  2. Если данные не нулевые, установить состояние
  3. После того, как состояние установлено , получить данные о посещаемости из базы данных
  4. Установить состояниесоответственно

Всегда пишите грубый алгоритм, прежде чем переходить в состояние dev (игнорировать, если вы уже это знали).Счастливого обучения, ура!

...