0

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

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

  1. 管理员用户登录——立即显示数据网格视图,并为每一行正确启用删除按钮
  2. 登出
  3. 以非管理员用户身份登录 - 数据已刷新,所有行仍处于启用状态,除了一个。它可能是第一行、第二行或第三行——它是完全随机的。这真的很奇怪。. .

我重新启动浏览器并遵循方案 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()}"/>
4

2 回答 2

2

听起来您可能会在这里发生一些事情。首先,值得注意的是 ItemRenderers 被重用;在一个网格(或列表等)中,例如包含十个专辑曲目的列表,每个曲目一行,在最初创建列表时,每一行都会正确呈现 - 但是当基础专辑时,扩展示例, 被更改,专辑曲目渲染器本身只有在正确连接时才会自动响应更改。通常,这涉及覆盖渲染器的数据属性的设置器:

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

    // .. Take some action
}

这可能是您的 CheckSecurity 方法不会在数据更改时被调用的原因——因为按钮的 enabled 属性是进入它的唯一方法,并且按钮已经被渲染。

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

我可以将 Flex 组件属性绑定到函数吗?

希望有帮助!如果您有任何评论,我会密切关注该主题以获取后续评论。

于 2009-01-15T16:49:26.647 回答
0

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

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

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

于 2009-01-15T16:36:27.467 回答