1

我有一个接口IBaseInterface和一个类BaseClass

BaseClass当我通过类型引用时,IBaseInterface带有事件名称的绑定不会触发。但是,正常绑定(没有事件名称)会触发。

如果我指的是BaseClasswithObjectBaseClasstypes 一切都可以,并且绑定会触发。

IBase接口:

[Event(name="propTwoChanged", type="flash.events.Event")]
[Event(name="propThreeChanged", type="flash.events.Event")]

[Bindable]

public interface IBaseInterface extends IEventDispatcher{

    function get propOne() :Number;
    function set propOne(value:Number) :void;

    [Bindable(event="propTwoChanged")]
    function get propTwo() :Number;

    [Bindable(event="propThreeChanged")]
    function get propThree() :Number;

}

基类:

[Event(name="propTwoChanged", type="flash.events.Event")]
[Event(name="propThreeChanged", type="flash.events.Event")]

[Bindable]

public class BaseClass extends EventDispatcher implements IBaseInterface{

    private var _propOne:Number = 0;
    public function get propOne() :Number{
        return _propOne;
    }
    public function set propOne(value:Number) :void{
        _propOne = value;
        dispatchEvent(new Event('propTwoChanged'));
        dispatchEvent(new Event('propThreeChanged'));
    }

    [Bindable(event="propTwoChanged")]
    public function get propTwo() :Number{
        return propOne * 2;
    }

    [Bindable(event="propThreeChanged")]
    public function get propThree() :Number{
        return propOne / 2;
    }

}

因此,为了澄清问题:

  • propTwo并且propThree绑定IBaseInterface不会触发。
  • propOne绑定没问题,这没有事件名称。
  • 只有通过接口访问时才会出现问题,其他类型都可以。
4

1 回答 1

2

我找到了 2 个选项来解决这个问题:

选项1

在接口上定义单个[Bindable(event="...")]元数据(而不是在函数签名上),然后调度单个事件以更新接口上的所有属性。

IBaseInterface

[Event(name="updateBindings", type="flash.events.Event")]
[Bindable(event="updateBindings")]
public interface IBaseInterface extends IEventDispatcher{

    function get propOne() :Number;
    function set propOne(value:Number) :void;

    function get propTwo() :Number;

    function get propThree() :Number;

}

BaseClass

[Event(name="updateBindings", type="flash.events.Event")]
[Bindable(event="updateBindings")]
public class BaseClass extends EventDispatcher implements IBaseInterface{

    private var _propOne:Number = 0;
    public function get propOne() :Number{
        return _propOne;
    }
    public function set propOne(value:Number) :void{
        _propOne = value;
        dispatchEvent(new Event('updateBindings'));
    }

    public function get propTwo() :Number{
        return propOne * 2;
    }

    public function get propThree() :Number{
        return propOne / 2;
    }

}

我认为这有点笨拙,如果视图中有很多属性或很多侦听器,那么它会占用太多资源。


选项 2

在接口上定义一个[Bindable] (不带事件),然后从类中直接调度一个PropertyChangeEvent.

IBaseInterface

[Bindable]
public interface IBaseInterface extends IEventDispatcher{

    function get propOne() :Number;
    function set propOne(value:Number) :void;

    function get propTwo() :Number;

    function get propThree() :Number;

}

BaseClass

[Bindable]
public class BaseClass extends EventDispatcher implements IBaseInterface{

    private var _propOne:Number = 0;
    public function get propOne() :Number{
        return _propOne;
    }
    public function set propOne(value:Number) :void{
        _propOne = value;
        dispatchEvent(new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, true, true, PropertyChangeEventKind.UPDATE, 'propTwo'));
        dispatchEvent(new PropertyChangeEvent(PropertyChangeEvent.PROPERTY_CHANGE, true, true, PropertyChangeEventKind.UPDATE, 'propThree'));
    }

    public function get propTwo() :Number{
        return propOne * 2;
    }

    public function get propThree() :Number{
        return propOne / 2;
    }

}

我认为这种方式是最好的,它比选项 1 不那么密集,因为只更新了所需的属性。它还清理了代码,可以从类和接口中删除大多数元数据。

于 2013-05-02T17:55:14.677 回答