Apache flex 怪异的行为
我对项目渲染器有一个非常奇怪的问题。我有一个带有ViewStack的main.mxml容器。当用户登录时,初始视图包含一个AdvancedDataGrid(包含一些数据和下面的ItemRenderer),它只显示一个Delete按钮。当用户登录时,此AdvancedDataGrid将从数据库中自动刷新。应根据用户的角色成员资格启用或禁用“删除”按钮 场景1(以管理员身份登录):Apache flex 怪异的行为,apache-flex,datagrid,itemrenderer,advanceddatagrid,Apache Flex,Datagrid,Itemrenderer,Advanceddatagrid,我对项目渲染器有一个非常奇怪的问题。我有一个带有ViewStack的main.mxml容器。当用户登录时,初始视图包含一个AdvancedDataGrid(包含一些数据和下面的ItemRenderer),它只显示一个Delete按钮。当用户登录时,此AdvancedDataGrid将从数据库中自动刷新。应根据用户的角色成员资格启用或禁用“删除”按钮 场景1(以管理员身份登录): 管理员用户登录--立即显示datagrid视图,并为每一行正确启用删除按钮 注销 以非管理员用户身份登录--数据被刷新
- 非管理员用户登录--立即显示datagrid视图,并为每一行正确禁用Delete按钮
- 注销
- 以管理员用户身份登录--除一行外,所有行仍处于禁用状态。它可以是第一行、第二行或第三行,完全是随机的。与第一种情况正好相反
[Bindable]
private function checkDeleteSecurity ():Boolean
{
return (SecurityProxy.CheckSecurity(SecurityProxy.UserName));
}
<mx:LinkButton label="Delete" click="onDeleteClick()" id="lbDelete" enabled="{checkDeleteSecurity()}"/>
[Bindable]
私有函数checkDeleteSecurity():布尔值
{
返回(SecurityProxy.CheckSecurity(SecurityProxy.UserName));
}
您应该在刷新数据时调用lbDelete.enabled=checkDeleteSecurity();这将确保每次刷新数据时都调用安全函数
我认为发生的事情是正在创建调用安全功能的组件,但是一旦创建了它,就没有什么可以更新linkbutton了
一旦创建了itemrender,假设它生成了6,那么当您刷新数据时,它将使用已经为下一组数据创建的6个itemrender(但具有更新的数据)。如果下一组数据需要8个ItemRenders,那么它只需要创建另外2个Renders。因此,只有这两个itemrenders将调用安全函数,因为它们尚未创建。听起来您可能在这里遇到了一些问题。首先,值得注意的是ItemRenders被重复使用;在一个网格(或列表等)中,比如说,包含一个十首专辑曲目的列表,每首曲目对应一行,当列表最初创建时,每一行都会正确呈现——但扩展示例,当基础专辑发生更改时,专辑曲目渲染器本身只有在正确连接后才会自动响应更改。通常,这涉及覆盖渲染器数据属性的setter:
override public function set data(value:Object):void
{
super.data = value;
// .. Take some action
}
这可能就是为什么在数据更改时不会调用CheckSecurity方法的原因——因为按钮的enabled属性是进入该方法的唯一途径,并且按钮已经呈现
此外,绑定到函数也有其自身的问题。昨晚确实有人问了这个问题,做了一些与您正在做的非常类似的事情(通过绑定到布尔函数的结果来设置按钮的状态):
希望有帮助!如果您有任何后续评论,我将密切关注该帖子。这是我的问题。这是第二部分;)每次绑定项行时都将调用数据属性设置器?那很有趣。因此,如果我在datagrid中有10行数据,在ItemRenderer中有一个Delete按钮。我提取新数据,只得到3行。即使第4-10行看起来是空的,你是说删除按钮仍然被渲染?太棒了,很高兴听到。是的,我很惊讶自己花了这么长时间才学会这个;我读过几本Flex书籍和大量的文档,对于知道它有多有用,你可能会认为它应该被更显著地记录下来。哦,好吧,很高兴这有帮助!