Apache flex 在dataprovider中缓存变量

Apache flex 在dataprovider中缓存变量,apache-flex,data-binding,datagrid,itemrenderer,datagridcolumn,Apache Flex,Data Binding,Datagrid,Itemrenderer,Datagridcolumn,我有一个模型类,它有一堆频繁变化的数字变量。 它们都发送自定义事件,因此是可绑定的 在我的UI中,其中几个类实例被捆绑到一个ArrayList中,作为Spark DataGrid的数据提供者。 类变量的变化非常好,所以问题就出现了 我现在想做的是根据输入的数据更改这些数字的颜色格式(确切地说是网格栏中相应的标签),也就是说,当新值较大时更改为绿色,当新值小于旧值时更改为红色 我怎样才能做到这一点?我考虑对旧值进行某种缓存,然后比较新旧值。 这是这样做的吗?如果是,怎么做?或者有没有另一种可能更简

我有一个模型类,它有一堆频繁变化的数字变量。 它们都发送自定义事件,因此是可绑定的

在我的UI中,其中几个类实例被捆绑到一个ArrayList中,作为Spark DataGrid的数据提供者。 类变量的变化非常好,所以问题就出现了

我现在想做的是根据输入的数据更改这些数字的颜色格式(确切地说是网格栏中相应的标签),也就是说,当新值较大时更改为绿色,当新值小于旧值时更改为红色

我怎样才能做到这一点?我考虑对旧值进行某种缓存,然后比较新旧值。 这是这样做的吗?如果是,怎么做?或者有没有另一种可能更简单的方法,不需要缓存任何东西

任何帮助都将不胜感激

编辑: 基于@NoobsArePeople2给出的示例,这是我当前的代码。 首先是数据网格。dataProvider是保存myModel类对象的ArrayList

<s:DataGrid dataProvider="{_listItems}" >
    <s:columns>
        <s:ArrayList>
        <s:GridColumn dataField="change" headerText="Change" itemRenderer="tableCell">
        <s:GridColumn dataField="bid" headerText="Bid" itemRenderer="tableCell">
  ...
</s:DataGrid>

...
现在是tableCell渲染器

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" width="100%" height="100%">

<fx:Script>
    <![CDATA[
        private var previousData:Number;
        private var labelColor:uint;
                    private var _data:Object;

        override public function set data(value:Object):void {

            previousData = _data;
            _data = Number(value);
            invalidateProperties();
        }

        override protected function commitProperties():void {
            super.commitProperties();

            if(previousData < data) {
                labelColor = 0x40c040;
            } else if (previousData > data){
                labelColor = 0xf05050;
            } else
                labelColor = 0xc0c0c0;

            itemLabel.setStyle("color", labelColor);
            itemLabel.text = String(_data); 
        }   
    ]]>
</fx:Script>

<s:Label id="itemLabel"/>
</s:GridItemRenderer>

(数据){
labelColor=0xf05050;
}否则
labelColor=0xC0;
itemLabel.setStyle(“颜色”,labelColor);
itemLabel.text=字符串(_数据);
}   
]]>
到目前为止,这工作得很好(与使用data属性引发未定义的错误相反),但是,当对多个网格列使用此项渲染器时,它对每个网格列使用相同的值。那是怎么回事


编辑:很抱歉,只有当我直接处理模型的属性时,如data.property,这才有效,我不能这样做。我需要所有列的通用项目渲染器。

我认为您应该为数据网格创建自定义项目渲染器。在那里,您应该重写
数据
setter并使用它来处理字段更改。示例用法为

或者,您可以通过以下方式在项目渲染器中重新分配数据:

override public function set data(value:Object):void
{
    if (value == data)
        return;
    myModelInstance = MyModelClass(value);
}

[Bindable]
private var myModelInstance:MyModelClass;

然后绑定到MXML项目渲染器中的
myModelInstance
字段。

方法是自定义项目渲染器。将附带一个
数据
属性(其中
数据
是数据提供程序提供的单个值),当数据提供程序在DataGrid上更改时,将为您设置该属性。你会想

  • 添加类型为
    Object
    的新私有变量
    previousData
    ,以及
  • 覆盖项目呈现器中数据的设置器
  • 数据的setter将如下所示:

    override public function set data(value:Object):void
    {
        // If the data hat not changed, don't do anything
        if (data == value) return;
    
        // Take the current data and store it in previousData
        previousData = data;
    
        // Update the current data to the new value that was passed in
        // BEGIN EDIT
        // data = value; <-- Previous code example is wrong it should be:
        super.data = value;
        // END EDIT
    
        // Tell Flex to update the properties of this renderer
        invalidateProperties();
    }
    
    override protected function commitProperties():void
    {
        super.commitProperties();
    
        // pseudo code follows
        if (previousData < data)
        {
            labelColor = green;
        }
        else if (previousData > data)
        {
            labelColor = red;
        }
        else
        {
            labelColor = black;
        }
    
        label.text = data;
        label.color = labelColor;
        // end pseudo code
    
    }
    
    或者,如果您需要访问
    数据的属性,并且不想硬编码值,那么这应该可以工作(注意:我实际上没有测试过这段代码,但它应该可以正常工作)

    重写受保护的函数commitProperties():void
    {
    super.commitProperties();
    //这假定项目呈现器子类[GridItemRenderer][2]
    var数据字段:String=column.dataField;
    var-previousValue:Object=previousData[dataField];
    var currentValue:Object=data[dataField];
    //下面是伪代码
    如果(以前的值<当前值)
    {
    labelColor=绿色;
    }
    否则如果(以前的值>当前值)
    {
    labelColor=红色;
    }
    其他的
    {
    labelColor=黑色;
    }
    label.text=数据;
    label.color=labelColor;
    //结束伪码
    }
    
    谢谢@NoobsArePeople2我理解你在这里做什么,基本上这正是我认为我需要的。然而,我对您的解决方案有一些小问题(我在这里没有详细说明,我以前没有真正使用ItemRenders)。首先,if(data==value)抛出一个“undefined”错误。其次,value对象的类型将是myModel,即使相应GridColumn上的数据字段设置为myModel.change,这是一个数字。我在上面的初始问题中添加了我的渲染器(基于您的代码)。这是因为我的代码示例有一个bug。查看以
    beginedit
    开头的部分此处出现了一些问题。即使在没有项目渲染器的情况下,我确实在数据网格列中获得了正确的值(包括更新),但在项目渲染器中转换为数字的值的简单跟踪在每次更新时总是输出NaN,我真的不明白,因为在没有项目渲染器的情况下,数据网格中的列显示的数字是正确的。在代码中,您要在
    \u data
    上设置值,您需要在
    data
    上设置它。明白了。但是,这并不能解决我必须通过data.propertyOfMyModel访问数值的问题,这意味着我必须为模型类拥有的每个属性编写项目呈现器。我已经考虑过从项目渲染器内部访问GridColum中的数据字段,但是spark组件似乎不支持这一点。我在这里真的迷路了。
    override protected function commitProperties():void
    {
        super.commitProperties();
    
        // This assumes your item renderer subclasses [GridItemRenderer][2]
        var dataField:String = column.dataField;
        var previousValue:Object = previousData[dataField];
        var currentValue:Object = data[dataField];
    
        // pseudo code follows
        if (previousValue < currentValue)
        {
            labelColor = green;
        }
        else if (previousValue > currentValue)
        {
            labelColor = red;
        }
        else
        {
            labelColor = black;
        }
    
        label.text = data;
        label.color = labelColor;
        // end pseudo code
    }