Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 怪异的行为_Apache Flex_Datagrid_Itemrenderer_Advanceddatagrid - Fatal编程技术网

Apache flex 怪异的行为

Apache flex 怪异的行为,apache-flex,datagrid,itemrenderer,advanceddatagrid,Apache Flex,Datagrid,Itemrenderer,Advanceddatagrid,我对项目渲染器有一个非常奇怪的问题。我有一个带有ViewStack的main.mxml容器。当用户登录时,初始视图包含一个AdvancedDataGrid(包含一些数据和下面的ItemRenderer),它只显示一个Delete按钮。当用户登录时,此AdvancedDataGrid将从数据库中自动刷新。应根据用户的角色成员资格启用或禁用“删除”按钮 场景1(以管理员身份登录): 管理员用户登录--立即显示datagrid视图,并为每一行正确启用删除按钮 注销 以非管理员用户身份登录--数据被刷新

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

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

  • 管理员用户登录--立即显示datagrid视图,并为每一行正确启用删除按钮
  • 注销
  • 以非管理员用户身份登录--数据被刷新,除一行外,所有行仍处于启用状态。它可以是第一行、第二行或第三行,完全是随机的。真的很奇怪 我重新启动浏览器并遵循场景2

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

    • 非管理员用户登录--立即显示datagrid视图,并为每一行正确禁用Delete按钮
    • 注销
    • 以管理员用户身份登录--除一行外,所有行仍处于禁用状态。它可以是第一行、第二行或第三行,完全是随机的。与第一种情况正好相反
    有趣的事实——如果我在checkDeleteSecurity中设置一个断点,它只有在第一个用户登录并且DATAGRID第一次刷新时才会到达。当我注销并且下一个用户登录时,数据网格被刷新,但checkDeleteSecurity断点从未被捕获。

    [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书籍和大量的文档,对于知道它有多有用,你可能会认为它应该被更显著地记录下来。哦,好吧,很高兴这有帮助!