我对ItemRenderer有一个非常奇怪的问题。我有一个带有ViewStack的main.mxml容器。当用户登录时,初始视图包含一个AdvancedDataGrid - 包含一些数据和下面的ItemRenderer - 它只显示一个Delete按钮。当用户登录时,此AdvancedDataGrid将自动从数据库刷新。应根据用户的角色成员资格启用或禁用“删除”按钮。
场景1(以管理员身份登录):
我重新启动浏览器并按照方案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()}"/>
答案 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个渲染器。因此,只有那两个项目符号才会调用安全功能,因为它们尚未创建。