奇怪的ItemRenderer行为

时间:2009-01-15 14:52:41

标签: flex datagrid itemrenderer advanceddatagrid

我对ItemRenderer有一个非常奇怪的问题。我有一个带有ViewStack的main.mxml容器。当用户登录时,初始视图包含一个AdvancedDataGrid - 包含一些数据和下面的ItemRenderer - 它只显示一个Delete按钮。当用户登录时,此AdvancedDataGrid将自动从数据库刷新。应根据用户的角色成员资格启用或禁用“删除”按钮。

场景1(以管理员身份登录):

  1. 管理员用户登录 - 立即显示datagrid视图,并为每行正确启用删除按钮
  2. 注销
  3. 以非管理员用户身份登录 - 刷新数据并且所有行仍然启用,但除外。它可能是第一行,第二行或第三行 - 它完全是随机的。这真的很奇怪。 。
  4. 我重新启动浏览器并按照方案2进行操作。 。

    场景2(以非管理员身份登录):

    • 非管理员用户登录 - 数据网格视图立即显示,删除按钮正确禁用每行
    • 注销
    • 以管理员用户身份登录 - 所有行仍然被禁用除了一个。它可能是第一行,第二行或第三行 - 它完全是随机的。恰好与第一种情况相反。

    有趣的事实 - 如果我在checkDeleteSecurity中放置一个断点,它只有在第一个用户登录并且DATAGRID首次刷新时才会到达。当我注销并且下一个用户登录时,数据网格会刷新,但是checkDeleteSecurity断点永远不会被捕获。

    [Bindable]
    private function checkDeleteSecurity ():Boolean
    {
         return (SecurityProxy.CheckSecurity(SecurityProxy.UserName));
    }
    
    <mx:LinkButton label="Delete" click="onDeleteClick()" id="lbDelete" enabled="{checkDeleteSecurity()}"/>
    

2 个答案:

答案 0 :(得分:2)

听起来你可能会在这里发生一些事情。首先,值得注意的是ItemRenderers被重复使用;在网格(或列表等)中包含,例如,十个专辑曲目的列表,每个曲目一行,每个行在最初创建列表时正确呈现 - 但是当底层专辑,扩展示例时,如果更改,专辑轨道渲染器本身只会自动响应更改,如果他们正确连线这样做。通常,这涉及覆盖渲染器的data属性的setter:

override public function set data(value:Object):void
{
    super.data = value;

    // .. Take some action
}

这可能就是为什么你的CheckSecurity方法没有被数据更改调用的原因 - 因为按钮的启用属性是进入它的唯一方法,并且按钮已经被渲染。

此外,绑定到函数有其自身的问题。昨晚有人问过这个问题,做了一些与你正在做的事情非常相似的事情(通过绑定布尔函数的结果在按钮上设置状态):

Can I bind a Flex component property to a function?

希望有所帮助!如果你有任何意见,我会密切关注后续评论的主题。

答案 1 :(得分:0)

您应该做的是刷新数据时调用lbDelete.enabled = checkDeleteSecurity();这将确保每次刷新数据时都会调用安全功能。

我认为发生的事情是你正在创建的组件调用安全功能,但是一旦创建它就没有更新链接按钮了。

一旦创建了itemrender,说它生成6然后当你刷新数据时它将使用那些已经为下一组数据创建的6个项目(但是有更新的数据)。如果下一组数据需要8个itemRenderer,那么它只需要创建另外2个渲染器。因此,只有那两个项目符号才会调用安全功能,因为它们尚未创建。