Создание пользовательского компонента, пользовательское свойство в схеме приводит к ошибке

Я хочу, чтобы в моей схеме было два пользовательских свойства, у которых есть запасное значение, если они не определены, или если их значение меньше 0.0

это схема:

schema: {
  url: { type: 'string'},
  key: { type: 'string'},
  intensity: {
    // default is -100 to trigger fallback
    default: -100, 
    parse: function (value) { 
      if (value >= 0.0) { 
        return value 
      } 
      return -100
    } 
  }
}

Свойство, которое вызывает у меня проблемы, является свойством интенсивности. Если это определено в a-сущности

<a-entity io3d-data3d="key: mykey; lightMapIntensity: 1.0" shadow="receive: true"></a-entity>

значение правильно используется компонентом, но когда я открываю 3D-редактор a-frame и нажимаю на объект - я получаю эту ошибку:

Ошибка А-кадра

этого не происходит, если атрибуты не установлены в a-entity,

Я делаю что-то не так при использовании пользовательских свойств? Есть ли способ определить необязательные свойства, которые по умолчанию имеют значение undefined или null?

Тип пользовательского свойства:

https://aframe.io/docs/0.6.0/core/component.html

2 ответа

Решение

Инспектор фреймов пытается округлить значения, используя toFixed(decimalPlaces) функция.

Переданные значения в компоненте являются строками, и, насколько я знаю, toFixed() не работает со строками, по крайней мере, ни в моих экспериментах, ни в документации.

Простое решение - вернуть проанализированное значение:

if (value >= 0.0) {
  return parseFloat(value);
}

Хотя при сравнении строк с числами с плавающей запятой выполняется дополнительный анализ, вы можете проанализировать значение перед проверкой:

value = parseFloat(value);
if (value >= 0.0) {
  return value);    
}

Итак, я заметил, что моя схема пыталась проанализировать мое свойство как строку. Я думаю, это запасной вариант, если вы не определили тип?

lightMapIntensity: {
  // default is -100 to trigger fallback to value specified in data3d file
  type:'float',
  default:-100.0,
  parse: function (value) {
    if (parseFloat(value) >= 0.0) {
      return parseFloat(value)
    }
    return -100.0 // = fallback to value from data3d file
  }
}

По крайней мере, у меня больше нет ошибки.

Может быть, у кого-то есть лучший ответ.

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