内联 itemRenderer

内联 itemRenderer

英文原文:《Inline itemRenderer》

原文地址:http://weblogs.macromedia.com/pent/archives/2006/12/inline_itemrend.cfm
原文作者:Peter Ent

译者:Dreamer。 本文未经同意,谢绝转载。

内联 itemRenderer
用来更新数据的itemRenderer

近来我很高兴和我们的一个客户Davita 的 Ryan Green一起工作,他同意我公开这一段代码。我喜欢这段代码因为它虽然很简单然而却包含了很多有趣的东西。在这个例子中我对Ryan 的原始代码做了一些更改。

下载例子源码:点击这里

我从别人那里听到过一些问题,他们将按钮或者其他的交互式组件放到DataGrid的一个单元格中并且想知道如何通过按钮来改变DataGrid。一个常见的使用就是删除本行记录。这里介绍了一种方法,在一个简单的订单列表中,点击"add to cart"链接会减少库存中货物的数量。当数量减少到0的时候该链接就会被禁用而且其标签更改为“out of stock”。

让我们从声明DataGrid开始。你将会看到一个内联的itemRenderer,对于此问题来说这是一个优雅的解决方案。你也可以使用一个代码相同的自定义组件作为itemRenderer。

<mx:DataGrid id=&#34;grid&#34; dataProvider=&#34;{dp}&#34; sel&#101;ctable=&#34;false&#34; y=&#34;45&#34; horizontalCenter=&#34;0&#34;
width=&#34;390&#34; height=&#34;169&#34;>
<mx:columns>
<mx:DataGridColumn headerText=&#34;Product&#34; dataField=&#34;product&#34;/>
<mx:DataGridColumn headerText=&#34;Quantity&#34; dataField=&#34;quantity&#34;/>
<mx:DataGridColumn headerText=&#34;Order&#34; dataField=&#34;action&#34; >
<mx:itemRenderer>
<mx:Component>
<mx:LinkButton label=&#34;{data.action}&#34;
enabled=&#34;{data.quantity > 0}&#34;
click=&#34;sendEvent()&#34;>
<mx:Script>
<![CDATA[

private function sendEvent() : void
{
dispatchEvent( new CustomEvent(data) );
}

]]>
</mx:Script>
</mx:LinkButton>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>

效果如图:

最后一列的itemRenderer是一个LinkButton。LinkButton的label是相应记录中&#34;action&#34;域的值。只有&#34;quantity&#34;域的值大于0的时候LinkButton才是激活的。当点击LinkButton的时候,会调用脚本代码中的sendEvent()方法。

注意:此处的itemRenderer是一个LinkButton,但是你也可以使用一个容器,比如一个Canvas,然后将LinkButton和其他与你的数据相关的组件放进去。

处理的点击事件方法sendEvent会分派一个ChartEvent(一个自定义事件)。ChartEvent只针对本行的数据记录。

注意:如果你对itemRenderer很陌生,请记住多数Flex组件,包括用来作为itemRenderer的组件都有一个data属性。这个属性是由dataProvider中与itemRenderer所在行相应的记录所设定的。

下面是CartEvent类的代码:

public class CartEvent extends Event
{
static public const ADD_TO_CART:String = &#34;addToChart&#34;;

public function CartEvent(data:Object, bubbles:Boolean=true, cancelable:Boolean=false)
{
super(ADD_TO_CART, bubbles, cancelable);
this.data = data;
}
public var data:Object;
}

这里没有多少需要说明的。事件类型是&#34;addToCart&#34;。这不是DataGrid分派的事件,那么你将如何监听并使用这个事件呢?问题的关键在于事件的bubbles属性的值:它默认在CartEvent构造函数中被设定为true。

由于DataGrid并不正式地支持&#34;addToCart&#34;,所以你不能将它作为一个属性放到<mx:DataGrid>标签中。但是你可以在ActionScript中为它设定一个事件处理器:

grid.addEventListener(CartEvent.ADD_TO_CART, customHandler);

使用customHander()函数:

private function customHandler( event:CartEvent ) : void
{
// the data record is included in the event; it can be modified and
// put back into the dataProvider wh&#101;re it will be picked up by the
// DataGrid
event.data.quantity -= 1;
dp.itemUp&#100;ated(event.data,&#34;quantity&#34;);
if( event.data.quantity <= 0 ) {
event.data.action = &#34;out of stock&#34;;
dp.itemUp&#100;ated(event.data,&#34;action&#34;);
}
}

当某一行中的LinkButton被点击的时候,将会分派一个CartEvent,该事件将由customHandler()函数处理。这个函数将更改对应数据记录的&#34;quantity&#34;的值然后dataProvider就被更新了。当&#34;quantity&#34;的值变成0的时候,&#34;action&#34;域中的文本将会更改为&#34;out of stock&#34;,同时dataProvider也将被更新。

一直点击Sprockets产品(看下图)的&#34;add to cart&#34;的链接直到它的数量减为0。然后LinkButton的标签就会变成&#34;out of stock&#34;并且被禁用。

注意当数据更新的时候属性的名字也传给了itemUp&#100;ated()方法,这样做可以保证只有那个域被更新了。如果dataProvider有排序操作的话,该域不是排序的一部分,更新它不会引发dataProvider自动排序。

这个例子可以有很多变型。例如,CartEvent可以传递行的索引而不是数据本身,然后customHandler就可以使用该索引从dataProvider中提取数据。在某些情况下索引可能比数据本身更有价值,或者你也可以同时使用这两个。

那么itemClick呢?

现在你可能会想:只通过itemClick就达到上述的目的阿,为何还好那样做?。没错,使用itemClick你可以知道哪一行的哪个域被点击了。然后你就可以更新数据,DataGrid中的显示也会自动更新。

但是这种方法的优势是:你有一个可交互的单元格——在本例中是一个LinkButton,但是它可以很复杂。当你需要一个自定义的itemRenderer的时候不妨考虑一下这种方法。



本文链接: http://www.zhuoqun.net/html/y2006/373.html 转载请注明出处,谢谢。

TrackBack引用地址: http://www.zhuoqun.net/html/y2006/373.html/trackback

相关日志

Posted in Flex, 技术.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值