Показать сообщение отдельно
  #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();
Ответить с цитированием