Аргументом конструктора компонента Ember является Proxy {} - PullRequest
0 голосов
/ 05 августа 2020

В проекте fre sh Ember 3.20 (то же самое в 3.19), после добавления нового компонента.

application.hbs:

<Test @foo="hello" />

components / test. js:

import Component from '@glimmer/component';

export default class TestComponent extends Component {
    constructor(){
        super(...arguments)
        console.log(this.args)
    }
}

Консоль: Прокси {}

Как мне получить доступ к this.args в конструкторе?

1 Ответ

1 голос
/ 22 августа 2020

аргументы компонента являются прокси-сервером, так что специальное поведение может переносить доступ к аргументам. Например, когда вы обращаетесь к одному из аргументов - только тогда аргумент будет "использован", а ваши геттеры / действия будут связаны с состоянием этого аргумента. Это дает преимущество в оптимизации отслеживания изменений по умолчанию, поэтому, если вы передаете 100 аргументов и используете только один или два из них в своем компоненте, вам не нужно оплачивать стоимость этих 100 аргументов, вызывающих обновления вашего компонента.

Это работает примерно так:

args = new Proxy(actualArgs, {
  get(target, argName) {
     consumeTag(tagFor(target, argName));

     return target[argName];
  }
});

Где обычно, если бы у вас был только ванильный объект, доступ к arg дал бы вам только значение. Этот прокси демонстрирует взаимодействие с системой отслеживания, так что теперь ваш компонент может быть запутан с обновлениями аргументов

Для получения дополнительной информации об автоматическом отслеживании @pzuraq подробно описывает здесь: https://www.pzuraq.com/how-autotracking-works/ (не обязательно автоматическое отслеживание в ember , но больше в целом )

Также документация по Proxy, если интересно: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Примечание: эта информация для Ember 3.13 +

...