【问题标题】:How do I make sure the text of an ActionScript TextInput is updated when the Object property defining that text is updated?当定义文本的 Object 属性更新时,如何确保更新 ActionScript TextInput 的文本?
【发布时间】:2010-12-02 18:39:58
【问题描述】:

这不是一个容易解读的问题,所以让我把它归结为。我正在尝试将 MXML 组件转换为 ActionScript 类。该组件包含一个带有 TextInput、TextArea 和两个按钮(保存和取消)的 Form,以及 TextInput 的 Validator,以及用于处理发生的事件的其他逻辑。该组件目前由其他几个组件扩展。

现在,在 MXML 组件中,将 TextInput 文本属性绑定到 Object 中的属性非常容易:

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

但是在 ActionScript 中,我在设置 Object 之前创建了 TextInput 并设置了 text 属性,并且 TextInput 没有被更新:

public var itemToEdit:Object = {};

private var nameInput:TextInput = new TextInput();

public function MyClass()
{
    nameInput.text = itemToEdit.name;
}

如何确保 TextInput 文本属性绑定到 Object 中的指定属性?

【问题讨论】:

  • 我想我只需要重新设计我的组件 - 我试图制作一个动态表单,但它不会按照我想要的方式工作。谢谢。

标签: apache-flex actionscript-3 data-binding text binding


【解决方案1】:

绑定就是触发更改事件。您需要将您的“itemToEdit”类修改为 EventDispatcher 才能使此 hack 起作用。来了

//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;
}

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

【讨论】:

    【解决方案2】:

    如果“itemToEdit”是一个纯 AS3 对象,那么绑定可能无论如何都无法正常工作。也就是说,它会在最初创建对象时起作用,但不会检测到对象中“名称”的任何更改。 (我可能是错的……还没有进行广泛的测试)

    无论如何,你的问题很容易用 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;
    }
    

    这里不需要绑定。

    【讨论】:

    • 不幸的是,这并非在所有情况下都有效 - 如果我在其他时间更新属性(这就是我正在做的),则不会调用 setter。
    • 这听起来像是一个架构问题。您可以为属性本身设置单独的 getter/setter,在 Object 和输入中设置值。或者,您可以有一个中心点来更改对象的属性并在发生这种情况时发送通知。查看 AS3 的 MVC 框架之一(PureMVC、Mate 等)
    【解决方案3】:

    使用 -keep 选项编译您的 MXML 组件。检查由 mxmlc 生成的 ActionScript 代码并执行类似操作。

    您也可以使用 Proxy 对象来执行此操作 - 我在这里写了一篇博客:http://flexblog.faratasystems.com/?p=433

    【讨论】:

    • 我试过了,但是我的基类在一个库项目中,我无法为该类获取生成的动作脚本。
    • 你不需要基类。在主项目中创建具有原始帖子中代码 sn-p 的类,并查看生成的代码。此外,compc 编译器也接受 -keep。
    【解决方案4】:

    显然,它比纯粹在 AS 中绑定的简单分配稍微复杂一些,这里有一些教程/文档向您展示如何实现它。

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

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

    【讨论】:

    • 仍然不适合我...我想我在其他地方做错了什么...不太确定如何调试绑定...。
    • 您一定做错了,因为 BindingUtils 本质上是 Flex 中所有基于 MXML 的绑定在生成的 ActionScript 中实现的方式。您可以发布您尝试使用的代码吗?
    • 就像我在另一篇文章中所说,MXML 绑定有时也会在检测对象属性的更改时出现问题。这可能就是这里发生的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多