Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Автоматический биндинг (https://javascript.ru/forum/dom-window/71941-avtomaticheskijj-binding.html)

victornalchik 23.12.2017 09:37

Автоматический биндинг
 
Пожалуйста подскажите, как можно избавиться от .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();

рони 23.12.2017 09:57

Цитата:

Сообщение от victornalchik
как можно избавиться от .bind(this)

вы решили что появилось что-то новое за месяц?https://javascript.ru/forum/dom-wind...eryaetsya.html

victornalchik 23.12.2017 10:07

Это другой вопрос и не связан с прошлым никак, для того ответа достаточно было использовать that или как в дальнейшем додумался использовать стрелочную функцию, 43 строка в вышеприведенном коде, а здесь вопрос в том что теряется инстанс model со свойствами в методе. И я даже не знаю куда копать чтобы решить эту проблему:(

victornalchik 23.12.2017 10:12

Т.е. код работает сейчас но стоит убрать .bind(this) и все инстанс model теряется, не помогает метод bindMethods (строка 15) (хотя с .bind(this) код работает и без этого метода). Рони, если сможете подсказать в чем кроется проблема, буду очень вам признателен!

victornalchik 23.12.2017 10:25

Если с резюмировать вопрос, то останется почему метод bindMethods не срабатывает, и теряется this.model при исключении .bind(this), ведь аналогичный процесс происходит в методе bindMethods?

рони 23.12.2017 10:51

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

или лучше подождать, когда они сами обратят внимание на эту тему.

victornalchik 23.12.2017 11:41

Ответ найден! Необходимо использовать стрелочные функции в объявлении метода, вот пример возможно кому нибудь в дальнейшем пригодится
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;
    }

рони 23.12.2017 11:44

victornalchik,
Цитата:

Сообщение от nerv_
4) используя arrow function



Часовой пояс GMT +3, время: 01:47.