Извините, если я неправильно понял ваш вопрос, но мне кажется, что я могу добавить миксины к тегу assets во время выполнения.Базовая версия будет означать написание компонента следующим образом:
// add assets at run time
AFRAME.registerComponent('addasset', {
init: function () {
var assets = document.getElementsByTagName('a-assets')[0]
var mixin = document.createElement('a-mixin')
mixin.setAttribute('id', 'makeitred')
mixin.setAttribute('material', 'color: red')
assets.appendChild(mixin)
},
});
и затем присоединить этот компонент к сцене следующим образом:
<a-scene addasset>
<a-assets>
</a-assets>
<a-cylinder
mixin="makeitred"
position="0 0.5 -3">
</a-cylinder>
</a-scene>
Вот рабочий глюк
Чтобы продемонстрировать, как это можно добавить, когда сцена запущена здесь, есть версия того же компонента с setTimeout
, чтобы продемонстрировать, как миксин может быть добавлен позже.
// add assets at run time, delayed
AFRAME.registerComponent('addasset', {
init: function () {
setTimeout(function(){
var assets = document.getElementsByTagName('a-assets')[0]
var mixin = document.createElement('a-mixin')
var cylinder = document.getElementsByTagName('a-cylinder')[0]
mixin.setAttribute('id', 'makeitred')
mixin.setAttribute('material', 'color: red')
assets.appendChild(mixin)
cylinder.setAttribute('mixin', 'makeitred')
}, 2000);
},
});
, а затем HTML-код, в который атрибут mixin будет добавлен позднее
<a-scene addasset>
<a-assets>
</a-assets>
<a-cylinder
position="0 0.5 -3">
</a-cylinder>
</a-scene>
Вот сбой этого
И дляради исследования, здесь то же самое настроено, но вызвано примером события.Сначала тот же компонент, но с прослушивателем событий
// add assets at run time, triggered by event
AFRAME.registerComponent('addasset', {
init: function () {
document.addEventListener("testevent", function(){
var assets = document.getElementsByTagName('a-assets')[0]
var mixin = document.createElement('a-mixin')
var cylinder = document.getElementsByTagName('a-cylinder')[0]
mixin.setAttribute('id', 'makeitred')
mixin.setAttribute('material', 'color: red')
assets.appendChild(mixin)
cylinder.setAttribute('mixin', 'makeitred')
});
},
});
Затем компонент, который генерирует событие для тестирования
// test event to trigger adding of mixin
AFRAME.registerComponent('testevent', {
init: function () {
var self = this.el
setTimeout(function(){
self.emit("testevent")
}, 3000);
},
});
Затем HTML, как и раньше, но включающий тестовую сущность, которая генерируетevent
<a-scene addasset>
<a-assets>
</a-assets>
<a-cylinder
position="0 0.5 -3">
</a-cylinder>
<a-entity
testevent>
</a-entity>
</a-scene>
И вот здесь есть сбой
Таким образом, вы можете смешивать их, добавлять миксин к активам, но задерживать / запускать при добавлении событиясвойства или добавить миксин к активам со свойствами, но задержать / вызвать событие, если установка этого атрибута для ваших целевых элементов.
Надеюсь, это поможет