Как я могу получить доступ к методу из замыкания? - PullRequest
0 голосов
/ 11 июня 2018

В поисках руководства по проблеме изменения объекта в функции замыкания.Я переписываю программу на Angular 5. Моя программа использует хранилище для управления мастером форм, где на некоторые вопросы отвечают элементы / кнопки svg.После нажатия устанавливается свойство объекта.Приведенный ниже код является скелетной версией того, с чем у меня возникла проблема.

Я читал другие закрывающие посты, но не нашел ни одного, который бы соответствовал моему сценарию.

Спасибо за ответы и / или предложения по рефакторингу.

class Builder {
  object:any;

  constructor(){
    this.object = {
       car:'blue'
    }
  }

  init(){
    //Short cutting to click commands.. Using lodash
    _.forEach(database, (o)=>{
      console.log(this.object.car); // 'blue' to console
      ((function(){
         button.click(function(){
            this.object.car = 'red';
            console.log(this.object.car); //Cannot read property 
                                              'object' of undefined
         });

       })(),false)
    }
  }

}

Обновление до исходного сообщения

Я думаю, мне нужно добавитьнемного больше информации на мои вопросы для других, которые могут столкнуться с этой проблемой.Код, который я предоставил, был скелетом моего общего кода.

Перед тестированием я выполнил рефакторинг вызовов функции (), используя обозначение стрелки () = {} (в разных комбинациях), и это не решило проблему, потому что это далее нарушало методы, требующие (this) .element какрезультат button.click ().

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Спасибо всем за комментарии и представленный ответ.Я хочу заявить, что ответ @LGson является надежным и работает.Но я чувствовал, что мне нужно немного почистить этот пост и поделиться тем, что я сделал, чтобы решить эту проблему для моей ситуации, которая использует платформу Canvas для генерации элементов пользовательского интерфейса, которые полагаются (this) на элемент внутри button.click ()событие и где я не мог получить доступ к внешнему объекту.

Вот как я смог заставить это работать.

  1. Я изменил внешнюю функцию на формат обозначения стрелки и оставилвызов button.click (), как указано в проблеме.
  2. Я добавил переменную для себя, которая указывает на объект, к которому я должен получить доступ.
  3. Я добавил метод получения вобъект для возврата значения внутренней ссылки необходим и использовал self.car и self.getter для установки и извлечения нужного мне значения.И метод библиотеки продолжает работать, как и ожидалось.

    class Builder {
     object:any;
    
     constructor(){
      this.object = {
        car:'blue',
        get value():{ return this.car;}
       }
      }
    
     init(){
      var self = this.object;
    
      _.forEach(database, (o)=>{
      console.log(this.object.car); // 'blue' to console
      ((()=>{
        button.click(function(){
             self.car = 'red';
             console.log(self.value); // red
    
        });
    
       })(),false)
    

    }}}

0 голосов
/ 11 июня 2018

Один из способов заключается в том, что если вы передадите this в качестве параметра, например,

   ((function(that){
     button.click(function(){
        that.object.car = 'red';
        console.log(that.object.car);
     });

   })(this),false)     // <--  pass 'this' here

И с помощью функции стрелки, которая сохраняет this, вы можете сделать что-то вроде этого

    console.log(this.object.car); // 'blue' to console
    button.click(() => {
        this.object.car = 'red';
        console.log(this.object.car);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...