在Flex中的主机组件和渲染器之间传递数据和调用函数

时间:2012-07-30 11:30:27

标签: flex actionscript renderer

是否有更好的方法在组件及其渲染器之间传递数据(也称为方法)? 我正在使用dispatchEvent(new CustomEvent(CustomEvent.SOME_EVENT, data));owner.dispatchEvent(new CustomEvent(CustomEvent.SOME_EVENT, data));或冒泡(取决于情况)。然后在该组件中收听我的活动。

为了将数据传递给渲染器,我正在使用:
(myList.dataGroup.getElementAt(myList.selectedIndex) as MyRenderer).doSomething(data);或修改dataProvider,但我必须在渲染器内调用read并调用方法。

这很糟糕,我必须callLater一直等待渲染器set data执行,否则渲染器不会被回收并且为空。

是否有更高效,更漂亮的方式在渲染器和组件之间传输数据和调用函数?

P.S。是的,我已将数据传递给渲染器。我的渲染器处理相当复杂的逻辑。

2 个答案:

答案 0 :(得分:0)

我以这种方式解决了与你类似的问题:

var goalPropDLRenderer:ClassFactory = 
         new ClassFactory(GoalPropagationDataListRenderer);

goalPropDLRenderer.properties = { isPropagationMode : isPropagationMode };

list.itemRenderer = goalPropDLRenderer;

其中:“list”是一个列表对象,我要设置一个项目渲染器;而不是设置项目渲染器内联(通过mxml在“列表”声明中),我已经使用了这种语法。这个代码是在“list”父的creationComplete上调用的(我认为有更好的地方)这样就可以将“properties”/“values”传递给渲染器。

在GoalPropagationDataListRenderer上我:

[Bindable]
public var isPropagationMode : Boolean;

由goalPropDLRenderer.properties = {isPropagationMode:isPropagationMode}填充;所以在渲染器中我可以毫无问题地访问isPropagationMode的值。

我希望它可以提供帮助。

答案 1 :(得分:0)

有一些方法,取决于你想要做什么(如果数据依赖于每一行,或者数据网格中的全局),但是就个人而言,我会避免使用callLater,你写道:(myList.dataGroup.getElementAt (myList.selectedIndex)为MyRenderer).doSomething(data)

你可以使用冒泡事件,然后在datagird(或任何时候)捕获它,然后通过myRenderer(event.target)获取渲染器,不需要使用getElementAt !,但questin是你何时派遣事件(我不知道细节)

如果您使用global(在datagrid含义中)逻辑:

  • 我会创建一些将在数据网格和渲染器中设置的常见对象(称为逻辑)(在我看来,将逻辑从视图中分离出来是好的做法)

  • 然后我会使用Claudio编写的解决方案(将属性设置为itemRenderer ClassFactory)来设置渲染器的逻辑

  • 或者你可以使用listData对象(但它不是那么简单)
  • 或者如果你在datagdid中的mxml中编写项目渲染器,你可以使用outerDocument轻松绑定它,例如logic =" {outerDocument.logic}"
  • 或者你可以只使用itemRenderer的所有者属性,所以每当你想要一些方法时,调用像MyDataGrid(所有者).doSomeDataGridCalculationsForData(数据),如果你不想创建逻辑对象则不需要