Хорошо, вот еще один обходной путь, который работает лучше, поскольку он позволяет мне сохранять код средства визуализации элементов в том же файле mxml с минимальными изменениями.Я нашел это совершенно случайно.Вместо того, чтобы определять встроенный тег <fx:Component>
средства визуализации элемента как дочерний элемент тега <s:itemRenderer>
, вы перемещаете его в тег <fx:Declarations>
и присваиваете ему имя класса.Затем поместите это имя класса в тег <s:itemRenderer>
.Это немного лучше для меня, чем экстернализация компонента рендеринга элементов.
Вот простой пример:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
<fx:Component className="PrintLine" id="printLineFactory">
<s:Label implements="mx.core.IDataRenderer" width="100%">
<fx:Script>
<![CDATA[
private var _data:Object;
public function get data():Object {
return _data;
}
public function set data(value:Object):void {
_data = value;
invalidateProperties();
}
override protected function commitProperties():void {
super.commitProperties();
if (_data) {
text = String(_data);
}
}
]]>
</fx:Script>
</s:Label>
</fx:Component>
</fx:Declarations>
<fx:Script>
<![CDATA[
//auto-complete works here now!
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout />
</s:layout>
<s:Scroller height="100">
<s:viewport>
<s:DataGroup width="100%">
<s:layout>
<s:VerticalLayout />
</s:layout>
<s:itemRenderer>
PrintLine
</s:itemRenderer>
</s:DataGroup>
</s:viewport>
</s:Scroller>
</s:Application>
То, что я должен сделать это, все еще глупо, и я все еще ненавижу Adobe,: - (
ОБНОВЛЕНИЕ: использование имени класса «PrintLine» работает только в приведенном выше коде, поскольку корневой тег является тегом приложения. В пользовательских подкомпонентах вместо этого необходимо привязаться к заводской ссылке:
<s:itemRenderer>{printLineFactory}</s:itemRenderer>