flex, похоже, не привязывается к пользовательскому объекту ActionScript - PullRequest
3 голосов
/ 25 мая 2009

У меня есть собственный объект actioncript, определенный как связываемый с рядом открытых свойств.

[Bindable]
public class MyObject extends Object {   

    public var mobileNumber:String;
...

В моем mxml у меня есть:

<mx:Script><![CDATA[
    import mx.binding.utils.BindingUtils;
    import org.test.MyObject;

    [Bindable]
    private var obj: MyObject = new MyObject();
]]></mx:Script>

<mx:Label text="Mobile Number" id="mobileNumberLabel"/>
<mx:TextInput id="mobileNumberText" text="{obj.mobileNumber}" />

<mx:LinkButton label="Load" id="loadButton" enabled="true" click="obj = obj.load();"/>
<mx:LinkButton label="Save" id="saveButton" enabled="true" click="obj.write();"/>

Моя проблема заключается в том, что, когда я ввожу новое значение в поле для номера мобильного телефона и затем нажимаю кнопку сохранения, введенное значение не выходит из системы ... т.е.

    public function write():void {
        var bytes:ByteArray = new ByteArray();
        trace("write - mobile:" + this.mobileNumber);

        bytes.writeObject(this);
        EncryptedLocalStore.setItem(KEY, bytes);
    }

Я также попытался добавить в:

    private function init():void {
        BindingUtils.bindProperty(mobileNumberText, "text", obj, "mobileNumber");
    }  

но с этим тоже не повезло.

Я, наверное, упускаю что-то простое здесь, но не уверен, что это такое. Надеюсь, вы можете помочь, спасибо.

Ответы [ 3 ]

8 голосов
/ 26 мая 2009

TST ответ правильный - привязки односторонние. Я предполагаю, что вы уже знали это, поскольку вы пытались установить обратную привязку в вашем методе init ().

Однако есть две проблемы с вашим методом init ().

Во-первых, неясно, куда вы поместили этот метод init () или как он вызывается.

Во-вторых, вы получили параметры метода в обратном направлении.

Что я обычно делаю в подобных ситуациях, это либо использую тег mxml, как предложил первый респондент, либо, если я в коде AS3, я делаю что-то вроде этого:

private function onCreationComplete(event:Event):void
{
  BindingUtils.bindProperty(obj, "mobileNumber", mobileNumberText, ["text"]);
}

Обратите внимание на пару моментов здесь:

1 / BindingUtils.bindProperty () - это "левая сторона = правая сторона". Таким образом, это все равно что писать

  obj.mobileNumber = mobileNumberText.text;

Или, ближе к тому, что «на самом деле происходит» внутри связывающих классов:

  obj["mobileNumber"] = mobileNumberText["text"];

2 / BindingUtils.bindProperty () фактически хочет массив в качестве последнего параметра. Это сделано для того, чтобы вы могли делать «связанные свойства» логически, например:

obj.mobileNumber = mobileNumbersGrid.selectedItem.text;

что будет

BindingUtils.bindProperty(obj, "mobileNumber", mobileNumbersGrid,
    ["selectedItem", "text"]);

3 / Рекомендация: если вы связываете цепочку свойств, начальный член которой является собственностью вашей (этой), напишите ее как:

BindingUtils.bindProperty(obj, "mobileNumber", this,
    ["mobileNumbersGrid", "selectedItem", "text"]);

Это аккуратно обрабатывает случай, когда ваш «правосторонний объект» сам экземпляр this.mobileNumbersGrid заменяется новым экземпляром объекта.

4 / Если вы когда-либо переназначите obj («левая сторона»), вам нужно создать новую привязку к новому экземпляру obj. Как правило, вы делаете это, превращая локальное свойство obj в пару метод получения / установки следующим образом:

  public function get obj():MyObject
  {
    return _obj;
  }

  private var _obj:MyObject = new MyObject();

  public function set obj(value:MyObject):void
  {
    _obj = value;
    BindingUtils.bindProperty(_obj, "mobileNumber", mobileNumberText, ["text"]);
  }

(Примечание: чтобы быть очень осторожным, вы должны спрятать возвращаемое значение из BindingUtils.bindProperty (), который является экземпляром ChangeWatcher, и отключить функцию (), чтобы старый объект не получил изменения свойств)

Надеюсь, это поможет. Привязки являются одними из самых мощных инструментов в среде Flex, но при плохом использовании могут вызвать много головной боли. В частности, следует помнить об утечках памяти и «неожиданных обновлениях», когда привязки остаются «зависшими».

1 голос
/ 25 мая 2009

Этот код:

<mx:TextInput id="mobileNumberText" text="{obj.mobileNumber}" />

создает однонаправленную привязку между obj.mobileNumber и mobileNumberText.text. Вам нужна дополнительная обратная привязка - добавьте следующую строку в ваш код, и она будет работать:

<mx:Binding source="mobileNumberText.text" destination="obj.mobileNumber"/>
0 голосов
/ 25 мая 2009

Вы пытались внедрить IEventDispatcher или расширить EventDispatcher?

Привязки работают через диспетчеризацию PropertyChangeEvents, так может в этом проблема? Кроме того, я не уверен, работают ли привязки с переменными или им требуются свойства (методы получения / установки).

Вы должны попытаться скомпилировать с -keep-generate-actionscript и посмотреть, имеет ли смысл полученный код, т.е. отправляет ли какие-либо события, если к переменной обращаются ...

...