【问题标题】:Flex: ArrayCollection should be read onlyFlex:ArrayCollection 应该是只读的
【发布时间】:2013-09-11 07:26:48
【问题描述】:

有没有办法让ArrayCollection is readyonly.. 所以客户端只能读取数据..但是additem或remove item

例子会很有帮助

提前致谢

【问题讨论】:

  • 将它包装在您的自定义类中并使包装的 ArrayCollection 为 const/final,我不记得了。仅提供 get 方法。在构造函数中初始化 ArrayCollection 并将其设为私有。
  • @GokcenG final 使对象不可覆盖。 const 是实例化后无法更改的变量(因此您不能再次调用 new)。在这种情况下,他们都不会帮助提问者。
  • @JoshJanusch 您确定 final 使“对象”不可覆盖还是使 classmethod 不可覆盖?好久没写 AS 代码了,所以就 Java 的 final 关键字来谈了。我认为这可能有助于他制作内部 ArrayCollection const 但你是对的,这对于解决方案并不重要。
  • @GokcenG 是的,这正是final 所做的。见this doc。并且使用const 只会阻止变量被重新实例化。它绝对不会阻止某人根据询问者的需要使用对象的方法或属性。
  • @JoshJanusch 我怀疑你的第一句话是正确的。他和我在谈论 ArrayCollection object 而不是 method。当我在 FB 上尝试时,它甚至不允许我将 final 放在 object 前面。

标签: apache-flex


【解决方案1】:

此类将允许您使用新的构造函数创建带有源数组的 ArrayCollection,但您将无法使用接口方法添加或删除项目。

package
{
import mx.collections.ArrayCollection;
import mx.collections.IList;

public class ArrayCollectionReadOnly extends ArrayCollection
{
    public function ArrayCollectionReadOnly(source:Array=null)
    {
        super(source);
    }

    override public function addAll(addList:IList):void {
        throw new Error("Illegal Operation, read only");    
    }

    override public function addAllAt(addList:IList, index:int):void {
        throw new Error("Illegal Operation, read only");    
    }

    override public function addItem(item:Object):void{
        throw new Error("Illegal Operation, read only");    
    }

    override public function addItemAt(item:Object, index:int):void{
        throw new Error("Illegal Operation, read only");    
    }

    override public function removeAll():void {
        throw new Error("Illegal Operation, read only");    
    }

    override public function removeItemAt(index:int):Object {
        throw new Error("Illegal Operation, read only");
        return null;
    }

    override public function setItemAt(item:Object, index:int):Object{
        throw new Error("Illegal Operation, read only");
        return null;
    }
}

}

【讨论】:

    【解决方案2】:

    当我想限制对内部集合的访问时,我通常只是从源元素返回一个新实例。

    private var _ac:ArrayCollection;
    
    public function get ac():ArrayCollection
    {
      return (_ac == null)? null : new ArrayCollection(_ac.toArray().concat());
    }
    

    在末尾添加 .contact() 可确保您获得一个新的源实例,而不是复制现有的实例。

    【讨论】:

    • 请注意,如果您使用 toArray() 过滤了集合,则此处不会包含所有项目。您需要连接“源”属性以将所有项目放入新集合中。
    • 另外我认为这个实现会更慢,因为每次你想访问它时都会实例化一个新的 ArrayCollection
    • @ChristopheHerreman 是的,这就是我的想法……获得该系列的当前表示。我明白为什么这可能并不总是可取的,所以谢谢你提出来。 (我只能用一个@)CodeMonkey 如果创建单个实例是你的瓶颈,那你一定是优化之王。对性能的影响可以忽略不计。只是不要做任何愚蠢的事情,比如在循环中引用它之类的。
    • @drkstr1 有时很重要,尤其是在移动设备上。
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多