this не ссылается на текущий контекст объекта во время перехвата Binding Behavior - PullRequest
0 голосов
/ 03 июня 2018

В приложении Aurelia я использую поведение привязки.Выглядит это так:

<div id="slider" ej-slider="e-value.two-way:controller.item.progress & intercept:controller.saveChange;" ></div>

Поведение привязки перехвата отсюда - это привязка controller.saveChange, которая действительно вызывается.

Однако,проблема в том, что в этом методе this относится не к контроллеру, а к привязке.Поэтому я не могу получить доступ к методам и свойствам контроллера, которые необходимы для фактического сохранения.

Вот как выглядит поведение привязки:

export class InterceptBindingBehavior {

readonly interceptMethods = ['updateTarget', 'updateSource', 'callSource'];

bind(binding, scope, interceptor) {
    let i = this.interceptMethods.length;
    while (i--) {
        let method = this.interceptMethods[i];
        if (!binding[method]) {
            continue;
        }
        binding[`intercepted-${method}`] = binding[method];
        let update = binding[method].bind(binding);
        binding[method] = interceptor.bind(binding, method, update);
    }
}

unbind(binding, scope) {
    let i = this.interceptMethods.length;
    while (i--) {
        let method = this.interceptMethods[i];
        if (!binding[method]) {
            continue;
        }
        binding[method] = binding[`intercepted-${method}`];
        binding[`intercepted-${method}`] = null;
    }
}
}

Как решитьэто?

Ответы [ 2 ]

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

Похоже, что оригинальный InterceptBindingBehavior поддерживает только метод непосредственно в текущей привязке, он использует interceptor.bind(binding, ... для обеспечения правильной установки this.

Но вы хотите, чтобы this было controller, а не текущая привязка.

Простое исправление состоит в том, чтобы принудительно принудительно установить this.

Либо в конструкторе компонента

export class YourComponent {
  constructor(...) {
    // guess you have this.controller = controller; somewhere

    this.controller.saveChange = this.controller.saveChange.bind(this.controller);
  }
}

, либо в конструкторе контроллера

export class Controller {
  constructor(...) {
    this.saveChange = this.saveChange.bind(this);
  }
}
0 голосов
/ 06 июня 2018

Что касается моего комментария, я бы постарался передать класс и метод отдельно в качестве аргументов.Я проверил это, и это работает.Но, возможно, некоторые эксперты aurelia знают, как лучше справиться с этим:

html

<div id="slider" ej-slider="e-value.two-way:controller.item.progress & intercept:controller:'saveChange'"></div>

InterceptBindingBehavior.ts

export class InterceptBindingBehavior {
readonly interceptMethods = ['updateTarget', 'updateSource', 'callSource'];

bind(binding, scope, interceptorClass, interceptorMethod) {
    let i = this.interceptMethods.length;
    while (i--) {
        let method = this.interceptMethods[i];
        if (!binding[method]) {
            continue;
        }
        binding[`intercepted-${method}`] = binding[method];
        let update = binding[method].bind(binding);
        binding[method] = interceptorClass[interceptorMethod].bind(interceptorClass, method, update);
    }
}

unbind(binding, scope) {
    let i = this.interceptMethods.length;
    while (i--) {
        let method = this.interceptMethods[i];
        if (!binding[method]) {
            continue;
        }
        binding[method] = binding[`intercepted-${method}`];
        binding[`intercepted-${method}`] = null;
    }
}
...