Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.06.2017, 17:01
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

Как задать нужный контекст?
Здравствуйте.

class Data {
      displayData(data){
        log(data);
      }
      getData(){
      let rqst =  new XMLHttpRequest();
      rqst.addEventListener('load', () => {
              if(rqst.status === 200) {
               this.displayData(rqst.responseText); /*Нужный контекст*/
              }
       })
      }

}
let any = new Data();
any.getData();

как задать нужный контекст, контекст класса для displayData?
Ответить с цитированием
  #2 (permalink)  
Старый 26.06.2017, 05:15
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Luca, а конкретнее?
Ответить с цитированием
  #3 (permalink)  
Старый 26.06.2017, 16:36
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

конкретнее? сами просили )
import React, { Component } from 'react';
class Json extends Component {
    constructor(props) {
        super(props);
        this.state = {
            date: new Date(),
            name: '',
            profession: '',
            age: 0
        };
    }
    displayName(json){
        try {
            this.setState({name: json.name});
        } catch (e) {
            alert("Exception occured: " + e.message);
        }
    }
    displayProfession(json){
        try {
            this.setState({profession: json.profession});
        } catch (e) {
            alert("Exception occured: " + e.message);
        }
    }
    displayAge(json){
        try {
            this.setState({age: json.age});
        } catch (e) {
            console.log("Exception occured: " + e.message);
        }
    }
    displayData(data){
        try {
            console.log(data);
            let json = JSON.parse(data);
            this.displayName(json);
            this.displayProfession(json);
            this.displayAge(json);

        } catch (e) {
            console.log("Exception occured: " + e.message);
        }
    }
    getData() {
        let request = new XMLHttpRequest();
        let url = 'http://zf.loc';
        request.open('GET', url);
        request.addEventListener('load',
            (function() {
                if (request.status === 200) {
                    this.setState(JSON.parse(request.responseText));
                } else {
                    console.log("Server Error: " + request.status);
                }
            }).bind(this) /*Вот здесь я пытаюсь вызвать displayData или setState и даже с .bind(this), но получаю "Type error: setState is not a function" или "displayName is not a function"*/
            ,false);
        request.addEventListener('error', function () {
            console.log("Can't Make AJAX Request");
        }, false);
        request.send();
    }

    componentDidMount() {
        this.timerID = setInterval(
            this.getData,
            3000
        );
    }
    componentWillUnmount() {
        clearInterval(this.timerID);
    }

    render() {
        return (
            <div>
                <h1>Hello, {this.state.name}</h1>
                <h2>Your profession is {this.state.profession}.</h2>
                <h2> Your age {this.state.age}</h2>
            </div>
        );
    }
}
export default Json;


"Балуюсь" с React и вот не видит у меня функция другую... Может не в контексте дело?
Ответить с цитированием
  #4 (permalink)  
Старый 26.06.2017, 18:24
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

componentDidMount() {
        this.timerID = setInterval(
            this.getData.bind(this),
            3000
        );
    }


Ну и еще в es-next можно так писать:

class Json extends Component {
    ...
    getData = () => {
        ...
    }
    componentDidMount() {
        this.timerID = setInterval(
            this.getData,
            3000
        );
    }
}

А еще можно использовать оператор :: в es-next



Ну и в реакте есть еще рабочая практика: функциям, которые будут вызываться в интервалах, или в хендлере события, контекст привязывают в конструкторе.

class Json extends Component {
    constructor(props) {
        super(props);
        this.getData = this.getData.bind(this);
        ...
    }
}

Последний раз редактировалось EmperioAf, 26.06.2017 в 19:14. Причина: дополнение
Ответить с цитированием
  #5 (permalink)  
Старый 27.06.2017, 08:11
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

this.doAny = this.doAny.bind(this);

любая нормальная программа должна читаться на естественном язые и в данном случае звучит так: "функция данного объекта это функция данного объекта в контексте объекта, которому она принадлжеит"
выглядит ужасно, но работает
спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить нужный пункт из списка на JS vlad35 Общие вопросы Javascript 3 11.11.2016 19:42
Как задать setInterval коду с оператором if? Сергей5739 Общие вопросы Javascript 5 03.10.2015 23:07
Как задать координаты для draggable-элемента, добавленного с помощью jquery UI begin jQuery 5 16.05.2014 20:14
Как найти нужный элемент? Mukhtar Events/DOM/Window 15 23.05.2013 16:07
как найти нужный объект? `p r o x y jQuery 2 05.05.2009 01:12