Привязка данных в Actionscript - PullRequest
2 голосов
/ 24 июня 2010

У меня есть класс со статическими свойствами, который я хочу использовать в качестве изображений. Я хотел бы, чтобы изображения были настраиваемыми во время выполнения, но все еще имели значения по умолчанию. Итак, класс Images выглядит так:

package {
public class Images {

[Embed(source="/assets/Green-Light.gif")]
[Bindable]
public static var GreenLight:Class;
}
}

А теперь пользовательский компонент:

package {
import mx.binding.utils.BindingUtils;
import mx.controls.Image;

import spark.components.HGroup;

public class MyComp extends HGroup {
    private var _image:Image;

    public function MyComp() {
        _image = new Image();
        _image.source = Images.GreenLight;
        addElement(_image);
        BindingUtils.bindSetter(setImageIcon, Images, "GreenLight");
    }

    private function setImageIcon(newIcon:Class):void {
        trace(newIcon);
        _image.source = newIcon;
    }
}
}

Теперь, если я создам приложение, подобное этому:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           minWidth="955"
           minHeight="600"
           xmlns:ns1="*">
<fx:Script>
    <![CDATA[
        [Embed(source="/assets/Yellow-Light.gif")]
        [Bindable]
        public var YellowLight:Class;
    ]]>
</fx:Script>
<mx:Image source="{Images.GreenLight}"/>
<s:Button x="10"
          y="40"
          label="Button"
          click="Images.GreenLight=YellowLight"/>
<ns1:MyComp x="40" y="0"/>
</s:Application>

Нажатие на кнопку изменит статическое свойство в классе Images на другое. Изображение, определенное в MXML, получит событие привязки и обновит изображение, но пользовательский компонент, созданный в ActionSctipt, обновляться не будет.

Мой вопрос - почему? и как мне это исправить?

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 июня 2010

Судя по сгенерированному коду, не стоит пытаться понять, как АС делает свое волшебство.В этом случае лучший (самый простой) вариант - просто превратить класс Images в Singleton, например:

package   {

public class Images {
    private static var _self:Images;
    public static function getInstance():Images {
        if(_self == null) {
            _self = new Images();
        }
        return _self;
    }
    [Embed(source="/assets/Green-Light.gif")]
    [Bindable]
    public var GreenLight:Class;
}
}

И класс MyComp будет выполнять привязку следующим образом:

BindingUtils.bindSetter(setImageIcon, Images.getInstance(), "GreenLight");

Спасибо Максиму за совет.

1 голос
/ 25 июня 2010

static переменные связываются с помощью специальной магии с сгенерированными EventDispatcher -s и StaticPropertyWatcher.Если вы хотите углубиться в это, добавьте -keep опцию компилятора.

Вот почему BindingUtils.bindSetter не работает.

Не уверен, что вы действительно хотите знать, как это исправить с помощью классов bindind :) Гораздо проще связать с Image экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...