我对Spark中的Flex开发很新,并想澄清构建组件的最佳方法。
我之前曾尝试使用绑定表达式来设置ViewStack的选定索引:
public class MyComponentView extends SkinnableComponent
{
public var selectedIndex:int = 0;
}
<s:Skin ...>
<mx:ViewStack selectedIndex="{hostComponent.selectedIndex}">
....
</mx:ViewStack>
</s:Skin ...>
但是,这个绑定表达似乎不起作用,但如果我将该绑定表达式移动到s:Label,它确实显示正确的数字。
为了实现这一点,我改变了代码:
public class MyComponentView extends SkinnableComponent
{
[SkinPart(required = "true")]
public var myStack:ViewStack;
private var _selectedIndex:int = 0;
private var _indexChanged:Boolean;
public function set selectedHistoryIndex(value:int):void
{
_selectedIndex = value;
_indexChanged = true;
invalidateProperties();
}
override protected function partAdded(partName:String, instance:Object):void
{
super.partAdded(partName, instance);
switch (instance)
{
case myStack:
_indexChanged = true;
invalidateProperties();
break;
}
}
override protected function commitProperties():void
{
super.commitProperties();
if (_indexChanged && myStack)
{
_indexChanged = false;
myStack.selectedIndex = _selectedIndex;
}
}
}
<s:Skin ...>
<mx:ViewStack id="myStack">
....
</mx:ViewStack>
</s:Skin ...>
这是我意味着这样做的方式吗?
答案 0 :(得分:0)
至于我,你的第二种方式更可取。我宁愿更改一些代码以使其更好:
public function set selectedHistoryIndex(value:int):void
{
if (_selectedIndex == value)
return;
_selectedIndex = value;
_indexChanged = true;
invalidateProperties();
}
是的,你可以从皮肤绑定到组件的属性,但这种方式View(Spark架构中的皮肤用于MVC中的View,而主机组件用于M和C)具有关于M的知识,这是不好的。第一个实现需要来自皮肤的这些知识。
第二个实现使View真实视图(由M管理)。这很好。