Вызовите метод, содержащий класс из средства визуализации элементов - PullRequest
0 голосов
/ 19 января 2012

Класс Собака. Обратите внимание, что собака не знает, где она находится. По логике собака не должна знать, где она находится.

public class Dog { 
    public var name:String;
    public var age:Number;
}

Компонент пользовательского интерфейса, который отображает всех собак в списке. Есть способ определить, сбежала ли собака.

<?xml version="1.0" encoding="utf-8"?>
<s:VGroup ... >
    <fx:Script>
        <![CDATA[
            [Bindable]
            private var listDataProvider:ArrayCollection /* ArrayCollection of Dogs */

            public var hasDogEscaped(dog:Dog):Boolean {
                return ...;
            }
        ]]>
    </fx:Script>
    <s:List id="list" dataProvider="{listDataProvider}" itemRenderer="DogItemRenderer"/> 
</s:VGroup>

Средство визуализации предметов, отображающее имя собаки и, если собака избежала объяснительной отметки рядом с именем собаки.

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer ...>
    <s:Label text="{(data as dog).name}" verticalAlign="middle" height="100%"/>

    <mx:Image id="dogEscaped" 
              visible="{???????????????????????????????????????.hasDogEscaped(data as Dog)}"
              source="@Embed(source='/assets/icons/warning.png')"/>
    </s:Group>
</s:ItemRenderer>

Я хотел бы, чтобы средство визуализации элементов вызывало метод hasDogEscaped из средства визуализации элементов, но я не смог выяснить, как это сделать. Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

2 голосов
/ 20 января 2012

Я бы не привязывался к функции.В любом случае вам это не нужно.

override public function set data(value:Object):void{
   if(value){
    super.data = value;
    dogEscaped.visible = yourFunction(data);
   }
}

Теперь, если вы хотите передать нестатическую версию yourFunction в свой dataGrid, вам нужно добавить ее в качестве свойства.Для этого вам нужно использовать ClassFactory, чтобы передать свойство вашему itemRenderer.В основном это выглядит так:

 dogItemRenderer= new ClassFactory(DogIteMRenderer);
 dogItemRenderer.properties = {dogEscapedFunction: dogEscapedFunction};
 dogColumn.itemRenderer = dogItemRenderer;

теперь убедитесь, что в вашем itemRenderer есть свойство dogEscapedFunction.

0 голосов
/ 21 января 2012

Вы можете использовать "outerDocument" для доступа к документу с вашим методом в нем.Примечание: метод должен быть помечен как общедоступный.

В качестве альтернативы, вы можете поместить функцию в синглтон, например, MyDogUtils.hasDogEscaped (), и вызывать ее, когда вам нужно, из средства визуализации элементов (99% всегда в наборепереопределение данных).

Или вы можете поместить его в средство визуализации элементов как статический метод.

0 голосов
/ 20 января 2012

Вы также можете сделать что-то вроде этого:

protected var escapeAlarm:IEventDispatcher;
[Bindable]
protected var dogItemRenderer:ClassFactory = new ClassFactory(DogItemRenderer);//you can bind to this renderer in your List component or whatever

//call from creationComplete
protected function init():void {
   dogItemRenderer.properties = {alarm: escapeAlarm};//again, you'll need to expose an alarm property on your renderer
}

public function dogHasEscaped(escapee:Dog):void {
  escapeAlarm.dispatchEvent(new DogHasEscapedEvent('escapeAlert', escapee);//will need custom Event Class, post back if you need help
}

Затем в рендере просто сравните сбежавшую собаку с визуализированной собакой.Это касается собак, которые убегают после того, как список составлен

0 голосов
/ 20 января 2012

Рендерер предметов предназначен для отображения ваших данных только не для логики приложения.
Поскольку ваша arrayCollection уже является привязываемой, вы должны добавить к ней прослушиватель событий для вызова hasDogEscaped при изменении.

0 голосов
/ 19 января 2012

Короче говоря - вам нужно добавить свойство isVisible для класса Dog. Хотя Собака не должна знать, где она находится, она должна знать, видна ли она. Создание путей в (и из) средства визуализации элементов, как правило, является плохой идеей. (Если это выходит за рамки класса Dog, вы можете использовать шаблон Adapter, чтобы обернуть существующий класс и добавить дополнительное свойство.) Средство визуализации элементов должно получать все данные, необходимые для правильного отображения того, что он отображает. .

Вы можете установить значение этого свойства в файле MXML, который определяет s: List, а затем переопределить метод set data в средстве визуализации элементов, чтобы определить, должно ли изображение быть видимым.

...