Проверить в шаблоне, является ли переменная массивом, строкой, числом

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

items = [
    {text: 'Length' , value: 10 },
    {text : 'Degree' , value : "108"},
    {text : 'Edges' , value : [10,20,30]}
]

Затем у меня есть компонент с именем app-label-values, расположенный внутри цикла * ngFor в родительском компоненте, как показано ниже.

<div *ngFor  = "let item of items">
  <app-label-values
   label = "item.text"
   value = "item.value">
  </app-label-values>
</div>

Назначение компонента app-label-values - отображать метку и значение, соответствующее метке.

Например, Возраст: 10 лет

Метка здесь всегда будет текстовой, а тип значения может быть динамическим (число, строки, массивы).

Поэтому, когда значение имеет тип array, мне нужно показать только длину массива, как в нашем случае компонент должен отображать «Edges: 3», поскольку [10,20,30] .length равно 3.

Моя цель - не использовать эту логику проверки типов в компоненте app-label-values, поскольку мне нужно, чтобы он был тупым и отображал только то, что ему передано.

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

Пожалуйста, помогите заранее.

value = "item.value.length" ??
Muhammad Usman 09.08.2018 07:33

@GeorgeBailey Это не будет работать для значений числового типа, value.length будет вызывать и ошибку, и даже если я конвертирую число в строку и применяю к ней длину, это даст мне нежелательный результат. например. '10'. Длина = 2

Shijil Narayanan 09.08.2018 07:39

Хорошо. Я действительно не пробовал, но вы можете проверить с value = "item.value.constructor == Array ? item.value.length : item.value"

Muhammad Usman 09.08.2018 07:49

Спасибо, Джордж, проверка конструктора мне показалась более понятной. Спасибо :)

Shijil Narayanan 09.08.2018 08:06

value = "item.value.push? item.value.length: item.value". Я сделал это, и он также работает в шаблоне, поскольку метод push принадлежит только прототипу массива. Однако я надеюсь, что получу лучшее решение, чем это.

Shijil Narayanan 09.08.2018 09:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
1 786
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать ngIf, чтобы проверить, есть ли у item.value свойство длины. В родительском компоненте вы все равно можете перейти к дочернему item.value, а в дочернем компоненте вы отображаете значение в зависимости от того, что это массив или число.

  1. проверить свойство длины
   <div *ngIf = "item.value?.length > {{item.value.length}} </div>

Если вы хотите напрямую передать длину массива вашему дочернему компоненту, вы можете рассмотреть возможность использования тернарного оператора

value = "item.value?.length ? item.value.length : item.value"

Если вы хотите проверить строковое значение, сначала проверьте, есть ли свойство длины. Затем можно использовать оператор + для анализа строки. А с помощью второго тернарного оператора вы можете проверить, является ли это числом или массивом.

value = "item.value?.length ? +item.value ? item.value : item.value.length : item.value" 
  1. проверить имя конструктора
value = "item.value.constructor.name === "Array" ? item.value.length : item.value"

Используя конструктор, можно также проверить, является ли значение строкой, числом и т. д. живой код

Это может привести к сбою при обнаружении строкового значения, поскольку и массив, и строка имеют свойство length. например. [10,20,30] .length = 3; '10'. Длина = 2

Shijil Narayanan 09.08.2018 07:41

В своем вопросе вы сказали, что это число или массив. Если это строка, вы можете преобразовать ее в число перед

edkeveked 09.08.2018 07:43

edkeveked - Как упоминал @George, проверка с помощью конструктора кажется более чистой, поскольку нам не нужно беспокоиться о синтаксическом анализе строки и числа. Отображать длину только тогда, когда конструктор представляет собой массив, иначе отображается как есть. Пожалуйста, исправьте меня, знаю, если я ошибаюсь .

Shijil Narayanan 09.08.2018 08:07

value = "item.value.push? item.value.length: item.value". Я сделал это, и он также работает в шаблоне, поскольку метод push принадлежит только прототипу массива. Однако я надеюсь, что получу лучшее решение, чем это.

Shijil Narayanan 09.08.2018 09:09

Я отредактировал ответ. Я добавил, как проверять напрямую с помощью конструктора

edkeveked 09.08.2018 09:17

value = "item.value.constructor.name == = " Массив "? item.value.length: item.value" работает. Спасибо

Shijil Narayanan 09.08.2018 09:22

Вы можете использовать оператор if Else в шаблоне с angular 4 и на wards ...

<div *ngFor  = "let item of items">
    <app-label-values *ngIf = "item.value.length >= 0; else elseIfTemp" label = "item.text" value = "item.value.length"> </app-label-values>
    <app-label-values label = "item.text" value = "item.value" #elseIfTemp> 
    </app-label-values>
</div>

Вы можете написать метод, который будет проверять тип и соответственно возвращать

вот пример

<div *ngFor  = "let item of items">
  <app-label-values
   label = "item.text"
   value = "checkType(item.value)">
  </app-label-values>
</div>

и в файле .ts

checkType(value){
  if (typeof value === 'object'){
    return value.length;
  }else{
    return value;
  }
}

вот - пример

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

Shijil Narayanan 09.08.2018 07:55

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

Aniket Avhad 09.08.2018 08:02

Как упоминал @George, проверка с помощью конструктора кажется более чистой, поскольку нам не нужно беспокоиться о строке и числе. Отображать длину только тогда, когда конструктором является Array else display как есть.

Shijil Narayanan 09.08.2018 08:05

да, я пробовал, и это не сработало. Итак, я нашел исправление как value = "item.value.push? item.value.length: item.value". Я сделал это, и оно также работает в шаблоне, как метод push относится только к прототипу массива, но я надеюсь, что получу лучшее решение, чем это.

Shijil Narayanan 09.08.2018 09:11

Другие вопросы по теме