【问题标题】:Bindable setter not called if value of property not changed?如果属性值未更改,则不调用可绑定设置器?
【发布时间】:2014-12-29 16:26:21
【问题描述】:

这可能是一个过于本地化的问题,但我会尽量概括它)

问题:如果属性setter被标记为Bindable,如果新值与旧值相同,它不会被调用吗?

我在继承的遗留项目中看到了上述行为:没有调用 setter。如果我没有将 setter 声明为 Bindable,那么无论新值是什么,都会调用 setter。

任何人都可以确认以上是设计用于 Binding 的方式吗?

这个项目到处使用Binding,并且代码中没有cmets,所以很难分辨出依赖关系是什么以及代码的哪些部分依赖于特定的绑定。我试图避免进行重大更改,但我也不想浪费时间尝试解决应该重构的问题。

属性绑定:

    [Bindable]
    protected var _source:AolMediaFile;

setter 被绑定:

    [Bindable]
    public function set source(file:AolMediaFile):void{
          _source = file;
         // do some stuff with file
    }

【问题讨论】:

    标签: actionscript-3 apache-flex flex4


    【解决方案1】:

    只有当事件源是[Bindable] 时才应该调用setter。数据绑定基本上是在各种场景中从源分派到目标的一系列事件。当您将您的属性或设置器声明为[Bindable] 时,这基本上不会在副作用方面改变任何行为,因为事件被调度并生成了侦听器。例如:

    <your:Component source="{any.source.aolMediaFile}" />
    

    仅当anysourceaolMediaFile 被声明为[Bindable] 时,source 才会被调用。将 source 声明为 [Bindable] 属性很有趣,如果第二个组件取决于您的组件的状态

    <your:Component id="yourComponent" source="{any.source.aolMediaFile}" />
    <s:TextField text="{yourComponent.source}" />
    

    如果您想绑定到AolMediaFile 的属性,那么类或特定属性也必须是[Bindable]

    如果无法生成绑定,通常编译器会打印警告:

    警告:无法绑定到类“对象”上的属性“源” (类不是 IEventDispatcher)

    所以检查源对象,即源的宿主对象的依赖和编译器警告。

    【讨论】:

    • 这就是为什么手动实现设置器总是比生成代码更有价值,因为您可以调试每一步。很高兴您找到了问题的根源。
    【解决方案2】:

    所以在这里挖掘更多我遇到了这个问题:Flex: Help me understand data Binding on getters and setters 它描述了通过声明 setter 或 getter Bindable 生成的代码

    所以显然在生成的代码中有一个检查值是否不同:

    public function set name(value:String)
    {
        if (_name == value)
            return;
        _name = value;
        dispatchEvent(new Event("nameChanged"));
    }
    

    【讨论】:

    • 我认为您误读了该帖子。 @Sunil D. 将此作为他自己的代码发布。他提到可以通过在标签中指定事件名称来防止生成自动生成的代码。这样,您可以提供自己的 setter 函数,该函数不包括检查值是否更改。但请记住,如果没有检查,setter 的循环调用将导致问题。我对 flex 没有经验,这就是我阅读他的答案的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多