由于命名空间中存在很多潜在的污染,特别是解析器自动声明任何具有id的MXML组件可以使用该ID公开访问,我发现使用camelCase来处理MXML元素ID是危险的。
例如:
<mx:TextInput id="textOne" text="This is a test" />
<mx:Button id="buttonOne" label="Click Me" click="textOne.text='Testing 1-2-3'" />
在这个相当简单的例子中,很明显Button的点击处理程序中的“textOne”指的是ID为“textOne”的TextInput。在以下示例中,它变得不那么明显了:
<mx:Button id="buttonTwo" label="Change Tab" click="tabNav.selectedChild=newState" />
“newState”在TabNavigator上下文中引用ID为“tabNav”的id为“newState”的INavigationContent实例并不是很明显。
如果我们在fx:Script块中执行此操作,或者在外部AS类文件中更糟糕(更好),这将变得更加清晰。
public function buttonClickHandler(event:FlexEvent):void {
tabNav.selectedChild = newState;
}
在这个AS类文件中我们没有声明tabNav或newState,因此,乍一看,我们期望解析器抱怨。但事实并非如此,因为这些ID会自动声明为公共属性。
我所得到的是感觉对我来说,我们应该制定一个公约,使这些公共财产的来源更加明显。像
这样的东西id="mxTabNav"
或
id="TXTMyTextInput"
或者只是使用下划线
id="my_text_input"
在Flash开发中,我们很多人为(自动)声明的舞台实例(如“mcMyTabBar”或“navMC”或“playPauseBTN”)执行此操作。
我正在寻找Flex社区对此的意见。我只是在想事情吗?我在这个主题上阅读的所有相关样式指南和最佳实践文档只是说“使用camelCase for id,并确保id属性是第一个属性”。
你有什么看法?
答案 0 :(得分:1)
我认为这并不是什么大不了的事。
我的所有组件都被封装(尽可能多),我甚至不给MXML中的元素ID,除非我真的必须(即模块后面的代码中引用了它)。
我宁愿通过
与我的组件进行交互myComponent.foo(bar);
其中函数在myFooComponent上设置文本
而不是
myComponent.myFooComponent.text = bar;
如果您根本没有引用MXML文件,则可以更进一步。我们有用AS编写的View类,它们都扩展了Group。在他们的createChildren函数中,我们添加了用MXML文件编写的组件。
这意味着没有任何内容直接针对MXML文件(除非他们通过显示列表开始生根,这可以快速说明关节),而View类完全封装了View对象。
我们甚至更进一步,只是通过它们的接口引用视图类,因此我们可以非常轻松地实现视图的多个实现(比如客户特定的更改)。
答案 1 :(得分:1)
我建议对id“”使用一对“目的和类名”。例如:
printButton, loggerTextArea, resultsDataGrid, etc
并且对于事件处理程序使用“on”模式。例如:
onPrintButtonClick(event:MouseEvent):void
onLoggerTextAreaChange(event:Event):void
onResultsDataGridSelect(event:Event):void