【问题标题】:Flex 4.6 Mobile - ItemRenderers and application dataFlex 4.6 Mobile - ItemRenderers 和应用程序数据
【发布时间】:2012-04-04 12:28:04
【问题描述】:

关于 ItemRenderers 的问题:假设我有一个 ArrayCollection,它是位于全局对象中的应用程序数据。我用这些数据填充了一个火花列表,将 ArrayCollection 设置为 dataProvider。

因此,每个 ItemRenderer 都会获得位于数组中的项目的副本。您可以覆盖“设置数据”方法以将数据设置为更特定于域的内容。问题是数据是原始项目的副本。

现在假设我们想在 ItemRender 中向项目添加一些数据。例如,它可以在项目上调用一个方法,告诉它加载有关自身的一些详细信息,或者我们允许用户修改项目上的某些内容。

显然,如果我们对副本进行操作,我们将无法执行任何操作,因为一旦 ItemRenderer 被销毁并且原始对象对发生的事情一无所知,它将被丢弃。

那么最佳做法是什么?我是否应该只使用渲染器的 itemIndex 从我的全局数组中提取原始项目,如下所示:

{globalArrayCollection}.getItemAt(this.itemIndex)

但这对我来说似乎有点笨拙。是否有处理此问题的最佳做法?

【问题讨论】:

    标签: actionscript-3 apache-flex flex4.5 flexbuilder


    【解决方案1】:

    不确定我是否在关注,但听起来您正在寻找一种方法来获取您的项目渲染器以设置/更改值。

    您可以直接访问渲染器上的方法。

    在您的渲染器中:

    public function setSomeValue(aValue:String):void{
         someString = aValue;
    
    }
    

    您还可以在 ArrayCollection 上设置数据。

    要访问此方法,您可以使用:

    var dataGroup:DataGroup = list.dataGroup;
    var itemRenderer:YourItemRenderer = dataGroup.getElementAt(list.selectedIndex) as YourItemRenderer;
    
    itemRenderer.setSomeValue("string");
    

    【讨论】:

    • 是的,您完全理解了这个问题,是的,这与我提出的解决方案相同。但是你总是必须在这两个地方修改代码。这不是一个理想的解决方案,但可能是唯一可能的解决方案。我会等几天看看是否有人可以提供更好的解决方案,否则我会将其标记为已回答。谢谢
    • 您可以将 ArrayCollection 的实例传递给 setSomeValue 方法,并让该函数同时更新
    • 不过,该实例将是原始数据的副本。同样的问题。我想在一个全球性的地方只拥有一份数据副本,这要求太多了吗? :-)
    • 传递给 setSomeValue 的集合不会是原始 ArrayCollection 的副本,它只是一个参考。所以是的,您仍然需要在两个地方设置数据,但可以用一种方法处理。
    【解决方案2】:

    嗯,为什么你认为如果你改变 itemRenderer 中的值,原来的 ArrayCollection 不会改变?对我来说,这很有效,并且初始 ArrayCollection 发生了变化。

    [Bindable]
    protected var model:Model;
    
    override public function set data(value:Object):void
    {
        super.data = value; 
        this.model = value as Model;
    }
    
    protected function changeValue():void
    {
        model.value = "newValue";
    }
    

    还是我误解了什么?

    【讨论】:

    • 我尝试使用代码示例进行响应,但无法在此站点上正确格式化。无论如何,如果您执行上面的代码,原始的 ArrayCollection 不会被修改。尝试将以下跟踪放在您的 changeValue 方法中: trace("BEFORE MODIFICATION:"); trace("全局变量:"+MyModel.dataList[itemIndex].value); trace("局部变量:"+this.model.value); this.model.value="修改值";跟踪(“修改后:”); trace("全局变量:"+MyModel.dataList[itemIndex].value); trace("局部变量:"+this.model.value);
    • 所以我不明白你在做什么。您的意思是,您已经使用静态 dataList 创建了类 MyModel 并尝试修改它?无论如何,我尝试了这种方式并得到了这个结果:修改前:全局变量:1 局部变量:1 修改后:全局变量:2 局部变量:2 所以绑定在那里也很完美
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多