代码之家  ›  专栏  ›  技术社区  ›  Eric Belair

当定义ActionScriptTextInput的对象属性被更新时,如何确保该文本被更新?

  •  0
  • Eric Belair  · 技术社区  · 15 年前

    这不是一个容易破译的问题,所以让我来概括一下。我正在尝试将MXML组件转换为ActionScript类。该组件由一个带有TextInput、TextArea和两个按钮(Save和Cancel)的窗体、一个用于TextInput的验证器以及处理发生的事件的其他逻辑组成。此组件目前由其他几个组件扩展。

    现在,在MXML组件中,将TextInput文本属性绑定到对象中的属性非常简单:

    <mx:TextInput text="{_itemToEdit.name}" />
    

    public var itemToEdit:Object = {};
    
    private var nameInput:TextInput = new TextInput();
    
    public function MyClass()
    {
        nameInput.text = itemToEdit.name;
    }
    

    4 回复  |  直到 15 年前
        1
  •  1
  •   enzuguri    15 年前

    绑定就是触发更改事件。您需要将“itemToEdit”类修改为EventDispatcher,才能使此黑客程序正常工作。来吧

    //item to edit class
    private var _name:String;
    
    public function set name(value:String):void
    {
        _name = value;
        dispatchEvent(new Event("NAME_CHANGED"));
    }
    
    
    //whatever the binding class is
    private var _itemToEdit:ItemToEdit;
    private var _textField:TextField;
    
    public function set itemToEdit(value:ItemToEdit):void
    {
        if (_itemToEdit) removeEventListeners();
        _itemToEdit = value;
        if (_itemToEdit) addEventListeners();
    }
    
    
    private function addEventListeners():void
    {
        _itemToEdit.addEventListener("NAME_CHANGED", itemToEdit_nameChangedHandler);
        itemToEditChangedHandler(null);
    }
    
    private function itemToEdit_nameChangedHandler(event:Event):void
    {
        _textField.text = _itemToEdit.name;
    }
    

    显然,这只是为了速度,你需要自定义事件和一些更好的名称等,但这是基本的jist。

        2
  •  0
  •   JStriedl    15 年前

    显然,纯粹在AS中绑定要比简单的赋值稍微复杂一些,这里有几个教程/文档向您展示如何完成它。

    http://cookbooks.adobe.com/index.cfm?event=showdetails&postId=6802

    http://raghuonflex.wordpress.com/2007/08/30/binding-in-mxml-as/

        4
  •  0
  •   Glenn    15 年前

    如果“itemToEdit”是纯AS3对象,那么绑定可能无论如何都不能正常工作。也就是说,当对象最初创建时,它将工作,但是不会检测到对对象中“name”的任何更改。(我可能错了…没有做过广泛的测试)

    不管怎样,你的问题很容易用getter/setter解决:

    private var _itemToEdit:Object;
    
    public function get itemToEdit():Object { return _itemToEdit; }
    public function set itemToEdit(value:Objecy):void {
      _itemToEdit = value;
      nameInput.text = value.name;
    }
    

    这里不需要装订。