【问题标题】:flex databinding with selectedItem property of the combobox update many times problemflex 数据绑定与组合框的 selectedItem 属性更新多次问题
【发布时间】:2010-01-23 03:08:55
【问题描述】:

好吧,我有一个组合框,我将他的 selectedItem 属性绑定到一个值对象对象,就像这样

<fx:Binding source="styles_cb.selectedItem.toString()" destination="_uniform.style"/>
<fx:Declarations>
<fx:XML id="config_xml" xmlns="" source="config.xml" />
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<mx:ComboBox x="66.15" y="63.85" editable="false" id="styles_cb" dataProvider="{config_xml.styles.style}" />

值对象是一个带有一些setter和getter的自定义类,我想根据组合的selectedItem的值设置一个属性,所以在值对象里面我有这样的东西

[Bindable]
public function set style(value:String):void
{
_style = value;
trace(value);
}

我的问题是,每次我更改组合框选择时,实际上会更改值对象的样式属性,它会执行 3 次,如果我跟踪 setter 的值,它实际上会跟踪 3 次,为什么?我怎样才能避免这种情况?我做错了什么?或者有更好的方法,请帮忙,谢谢您的帮助

【问题讨论】:

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


    【解决方案1】:

    数据绑定表达式的触发次数通常比预期的多很多倍。我不知道确切的原因。如果这会导致您的应用出现问题,则不要将源直接绑定到目标,而是使用失效。绑定源以设置标志、stylesSelectedItemChanged 并调用 invalidateProperties()。然后覆盖 commitProperties() 并在您的 commitProperties() 内部检查 stylesSelectedItemChanged 是否为 true,如果是,则将新值传播到目的地并将标志重置为 false。一定要调用 super.commitProperties() 否则很多事情都会中断。

    失效在 Flex 框架中极为常见,每个组件都在内部使用它,它对解决这类问题有很大帮助。

    【讨论】:

    • 好吧,我找到了我的问题的答案,但是你的方法很有趣,而且我肯定可以在其他情况下使用它,你间接回答了我的另一个问题,非常感谢 :)
    【解决方案2】:

    哇!!,有时写一个问题让你三思而后行,让你自己找到答案,所以我找到了自己的解决方案,在文档中说如果我可以使对象的所有属性都可绑定将 [Bindable] 放在类声明中,所以我是这样做的

    [Bindable]
    [RemoteClass(alias='Uniform')]
    public class Uniform extends Object implements IEventDispatcher
    

    但是,当我试图在我在文档中找到的设置器中调度事件时,我必须像这样添加事件名称

    [Bindable("styleChanged")]
    public function get style():String
    {
       return _style;
    }
    
    public function set style(value:String):void
    {
     _style = value;
     dispatchEvent(new Event("styleChanged"));
    }
    

    现在我发现这样做,用双重绑定标记属性,这让我多次设置属性,拥抱!但现在我知道我可以避免使用第二个 [Bindable] 并且事件仍然得到调度,所以现在我想知道如果我仍然可以仅使用 [Bindable] 和调度方法来分发事件,为什么我需要首先使用 [Bindable("styleChanged")]?,很奇怪

    希望对某人有所帮助

    【讨论】:

    • 这是对您自己问题的回答中的第二个问题?!?没有名称的 [Bindable] 将导致编译器自动将 setter 包装在另一个方法中,该方法调度“propertyChanged”事件,并且事件对象具有关于哪个属性更改的信息。 [Bindable("somethingChanged")] 根本不会更改您的代码,并表明您将自己调度此事件。第二种形式是首选,因为该事件是该属性所独有的。如果这是一个真正的问题,我可以解释更多..但是答案中的问题.. cmets 是有限的..
    • 是的,很抱歉,但是你说的是真的,对我很有用,谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2011-06-28
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多