Nano Hash - криптовалюты, майнинг, программирование

Как включить константы, импортированные в компонент в шаблоне без прокси через свойства в Angular?

В моем компоненте я импортировал константу и использую ее как есть.

import { NullGuid } from "src/app/models/constants";
...
@Component({ ... })
export class TheComponent implements OnInit {
  constructor(private service: SomeService) { this.proxy = NullGuid; }
  ...
  proxy: string = NullGuid;
}

В шаблоне я могу получить доступ к сервису следующим образом.

<div>{{this.service.getStuff()}}</div>

Однако я не могу сделать то же самое с константой если она не объявлена, как показано выше. Могу ли я каким-то образом выставить импортированную константу, не объявляя для нее прокси-свойство?

22.12.2019

  • Нет, доступ к общедоступным свойствам класса можно получить только из шаблона. 22.12.2019
  • @jonrsharpe Я могу получить доступ к введенному сервису, и это своего рода свойство, не так ли? Насколько я понимаю, это частное свойство, и к нему может получить доступ this.service как в компоненте , так и в шаблоне. Что я тут путаю? 22.12.2019
  • Я считаю, что это будет работать в режиме JIT, но не работает в AOT; нет привата во время выполнения. См., например. stackoverflow .com/questions/34574167/. Также вам не нужно использовать это в шаблоне. 22.12.2019
  • @jonrsharpe Ах, это я неряшливый. Я забыл проверить, выдает ли AOT ошибки. Виноват. Хотя, что касается this в шаблоне, я заметил, что не могу получить доступ к свойствам службы, внедренной как private в конструкторе, если я использую только service.serviceId, но это это сработало, когда я пошел this.service.serviceId. Возможно, это связано с JIT или чем-то еще, и в любом случае это неправильный подход. 22.12.2019

Ответы:


1

У меня есть обходной путь для этого с использованием труб. У меня есть труба, как показано ниже:

import { Pipe, PipeTransform } from '@angular/core';
import * as constants from "./constants";

type key= keyof typeof constants;

@Pipe({
  name: 'constant'
})
export class ConstantPipe implements PipeTransform {
  transform(value: any, args:key): any {
    return constants[args];
  }
}

И используйте это так:

{{null | constant:'LuckyNumber'}}

EDIT: Как упоминал @KonradViltersen в комментариях, я думал использовать value вместо args. Но тут пришла идея с Angular Language Service. Если вы измените тип args с string на тип key, языковая служба предоставит вам автодополнение, что хорошо, когда у вас большое количество констант. Но если вы измените тип values на key, у вас будет только некоторая ошибка в вашем шаблоне, которая сообщит вам о несоответствии типов и об отсутствии ошибок времени выполнения. Это становится предпочтением, как вы его используете.

Также у вас возникают проблемы с перечислениями.

import * as enums from './enums';

type key = keyof typeof constants;
type enumKey = (keyof typeof enums) ;


@Pipe({
  name: 'enum'
})
export class EnumPipe implements PipeTransform {
  transform<T extends enumKey, R extends keyof typeof enums[T]>(value: T, args: R): typeof enums[T][R] {
    return enums[value][args];
  }
}

Который можно использовать как

{{ 'Complexity' | enum : 'Hard' }}

Он обеспечит автозаполнение для Hard, но не для Complexity.

Stackblitz

22.12.2019
  • Это было здорово. Мне нравится это. Но вопрос по сложности. Не было бы более разумно пропустить параметр args и сопоставить value только с тем, чему может соответствовать это (постоянное) строковое значение? Я думаю об использовании, например, {{LuckyNumber|constant}}, а затем использую это конкретное значение для выбора из набора констант, импортированных в канал. Я полагаю, поскольку это константа, нет необходимости указывать какое-либо (изменяющееся) значение, поскольку оно все равно будет проецироваться на одно и то же (постоянное) значение. Что вы думаете? (+1 за изящность) 23.12.2019
  • Да, таким образом, у него будет чистый синтаксис. я обновлю его 23.12.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..