Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2017, 09:37
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

Автоматический биндинг
Пожалуйста подскажите, как можно избавиться от .bind(this) в методах в восьмой строке кодов? Был написан метод bindMethods (15 строка), но как только я убираю .bind(this), сразу теряются инстансы со свойствами (tthis.model.row и т. д.)

import { View } from "./view";
import { Model } from "./model";
import { IController } from "./interface";

export class Controller implements IController{
    flagStartGame:number;

    private view = new View(this.getOptionsField.bind(this), this.getOptionsCell.bind(this), this.changeFieldRandom, this.startGame.bind(this), this.stopGame.bind(this));
    private model = new Model();

    constructor() {
        this.bindMethods(['getOptionsField', 'getOptionsCell',  'changeFieldRandom', 'startGame', 'stopGame']);
    }

    bindMethods(methods) {
        methods.forEach((item) => {
            this[item] = this[item].bind(this);
        });
    }

    getOptionsField(row: number, column: number){
        this.model.row =row;
        this.model.column=column;
        this.model.matrix = this.model.createNewMatrix(this.model.row, this.model.column);
        return this.model.matrix;
    }

    getOptionsCell(cellRow: number, cellColumn: number){
        this.model.cellRow=cellRow;
        this.model.cellColumn=cellColumn;
        this.model.matrix = this.model.createChangeMatrix(this.model.matrix, this.model.row, this.model.column, this.model.cellRow, this.model.cellColumn);
        return this.model.matrix;
    }

    changeFieldRandom(){
        this.model.matrix = this.model.createRandomMatrix(this.model.row, this.model.column);
        console.log(this.model.matrix);
        return this.model.matrix;
    }

    startGame(){
        if(!this.flagStartGame) {
            this.flagStartGame = setInterval(()=> {
                this.model.stopGameCheck();
                this.view.startFieldChange(this.model.matrix);
                if(this.model.flagStopGame){
                    clearInterval(this.flagStartGame);
                    this.flagStartGame = null;
                    alert('Игра окончена!');
                }
            });
        }
    }

    stopGame(){
        if(this.flagStartGame){
            clearInterval(this.flagStartGame);
            this.flagStartGame = null;
        }
    }
}

let controller  =  new Controller();
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2017, 09:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Сообщение от victornalchik
как можно избавиться от .bind(this)
вы решили что появилось что-то новое за месяц?https://javascript.ru/forum/dom-wind...eryaetsya.html
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2017, 10:07
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

Это другой вопрос и не связан с прошлым никак, для того ответа достаточно было использовать that или как в дальнейшем додумался использовать стрелочную функцию, 43 строка в вышеприведенном коде, а здесь вопрос в том что теряется инстанс model со свойствами в методе. И я даже не знаю куда копать чтобы решить эту проблему
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2017, 10:12
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

Т.е. код работает сейчас но стоит убрать .bind(this) и все инстанс model теряется, не помогает метод bindMethods (строка 15) (хотя с .bind(this) код работает и без этого метода). Рони, если сможете подсказать в чем кроется проблема, буду очень вам признателен!
Ответить с цитированием
  #5 (permalink)  
Старый 23.12.2017, 10:25
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

Если с резюмировать вопрос, то останется почему метод bindMethods не срабатывает, и теряется this.model при исключении .bind(this), ведь аналогичный процесс происходит в методе bindMethods?
Ответить с цитированием
  #6 (permalink)  
Старый 23.12.2017, 10:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

victornalchik,
могу только рекомендовать
rise
nerv_
aetae

или лучше подождать, когда они сами обратят внимание на эту тему.
Ответить с цитированием
  #7 (permalink)  
Старый 23.12.2017, 11:41
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 21

Ответ найден! Необходимо использовать стрелочные функции в объявлении метода, вот пример возможно кому нибудь в дальнейшем пригодится
getOptionsField=(row: number, column: number)=>{
        this.model.row =row;
        this.model.column=column;
        this.model.matrix = this.model.createNewMatrix(this.model.row, this.model.column);
        return this.model.matrix;
    }
Ответить с цитированием
  #8 (permalink)  
Старый 23.12.2017, 11:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

victornalchik,
Сообщение от nerv_
4) используя arrow function
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматический подгон под табуляцию при переносе строк браузером danies Общие вопросы Javascript 4 14.03.2015 20:37
Автоматический старт при при горизонтальной прокрутке div блоков admin'ko Элементы интерфейса 3 13.02.2015 09:40
Двухсторонний биндинг. Как это делается? Aries Events/DOM/Window 7 20.02.2014 12:34
Автоматический лайк facebook Mateus Серверные языки и технологии 5 30.03.2013 19:01
Автоматический пересчёт при смене значения. sergeos Работа 3 05.02.2013 13:44