Слушайте привязываемую собственность в связываемой коллекции Arraycollection - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть привязываемый класс модели (назовем его myModel) с двумя свойствами, меткой и значением.Значение часто обновляется, поэтому оно помечается как связываемое.До сих пор работает нормально, данные обновляются, и отправляется стандартное событие изменения свойства.

Теперь мне нужно сделать ArrayCollection из экземпляров объекта этой модели, чтобы использовать его в качестве поставщика данных в группе данных.Затем данные передаются в пользовательский itemRenderer, в котором я обращаюсь к свойствам myModel через data.label и data.value.

Единственная проблема, с которой я столкнулся сейчас, заключается в том, что свойство значения myModel не меняет ничегобольше (я полагаю, потому что я сохранил объекты в ArrayCollection).

Кстати, ArrayCollection также помечается как привязываемый, поскольку новые экземпляры объекта myModel могут быть добавлены во время выполнения.

Есть ли способ заставить эту работу?Любая помощь по этому поводу будет принята с благодарностью!

Редактировать: Я почти забыл, объект значения в классе myModel обновляется другим связываемым классом.Да, я знаю, что это безумие, но именно поэтому я здесь, чтобы получить некоторую информацию о более простом (и действительно работающем) способе решения этой проблемы.

2-е редактирование: Ладно, ребята, немного кодачтобы проиллюстрировать проблему,

Давайте начнем с первого связываемого класса;

[Bindable]
public class FirstClass
{
   public var name:String;
   public var firstValue:Number;
   public var secondValue:Number;
   public var thirdValue:Number;

   public function FirstClass()
   { }
 }

Значения (с первого по третий) обновляются классом контроллера.Все идет нормально.Теперь перейдем ко второму классу модели (для обеспечения согласованности оставим имя MyClass)

[Bindable]
public class MyClass
{
   public var label:String;
   public var value:Number;

   public function FirstClass()
   { }
 }

Это два класса моделей.Основанием для этого является то, что мне нужно значение String (метка) для каждого свойства экземпляра FirstClass.Я хотел бы сделать это проще, поэтому я действительно не остановился на этом "решении" кашель ;).

Во всяком случае, у нас есть две модели, теперь на мой.mxml class;

[Bindable] private var firstClassInstance:FirstClass;

Я создаю новую коллекцию ArrayCollection и добавляю подобные объекты;myArrayCollection.addItem (new MyClass («Это метка», firstClassInstance.firstValue));

И снова DataGroup использует эту ArrayCollection в качестве поставщика данных.

Как мы уже установили (спасибо @Windowns), ArrayCollection ищет только объекты, которые добавляются или удаляются, а не изменения свойств этих объектов.

Ответы [ 4 ]

1 голос
/ 05 декабря 2011

Вызовите itemUpdated в вашей коллекции ArrayCollection, когда вы обновляете «часть» сохраненного в нем элемента.

1 голос
/ 05 декабря 2011

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

При использовании привязываемой коллекции массивов объектов важно отметить, что привязка для массива коллекций просматривает только каждый экземпляр объекта, и еслидобавлены или удалены из коллекции.Он не будет знать об изменениях свойств, которые происходят с вашим объектом.Обычно при использовании itemrenderer свойства привязываются к отображаемым элементам.Как, может быть, свойство value, привязанное к метке в itemrenderer.Теперь, когда ваш экземпляр объекта (myModel) меняет свое свойство «значение», метка должна его забрать.Также обратите внимание, что вам нужно пометить любые свойства, которые вы собираетесь связать с визуальными элементами, с помощью метатега [Bindable].

public class myModel
{
    [Bindable]
    public var label:String;
    [Bindable]
    public var value:String; 

    public function myModel() {}
}

Ответ после кода:

Когда вы делаете следующее:

myArrayCollection.addItem(new MyClass("This is a label", firstClassInstance.firstValue));

Вы берете значение firstClassInstance.firstValue и задаете его как жесткое значение (как при передаче значения по ссылке).Поэтому, если вы сделаете следующее:

myArrayCollection.getItemAt(addedClassIndex).value = 5;

Не приведет к тому, что какие-либо изменения будут отмечены в firstClassInstance.firstValue, так как не сохраняется «справочная информация».Мы работаем только с базовым типом Number, который никогда не передается по ссылке, как все другие объекты в Flex.

Может быть, попробуйте это:

[Bindable]
public class MyClass
{
    public var label:String;

    [Bindable]   //might be redundant due to global [Bindable] flag, been a while since i've used a global one
    public function get value():Number{
        return m_objRef.firstValue;
    }
    public function set value(value:Number):void{
        m_objRef.firstValue = value;
    }

    private var m_objRef:FirstClass;

    public function MyClass(_label:String, _valueObj:FirstClass) {
        m_objRef = _valueObj;
        label = _label;
    }
}
0 голосов
/ 08 декабря 2011

Я воспользовался советом Эми и немного углубился в метод обновления элемента.Оказывается, решение было именно там.

См. Здесь: http://flex4examples.wordpress.com/2009/08/28/1st/

Я применил эту методологию (с небольшими изменениями) к своему коду, и она работает довольно хорошо.Производительность на iPad2 хорошая, так же как и использование памяти моим компонентом.

Будем надеяться, что Эми тоже подойдет для этого решения.Скрещенные пальцы.;)

0 голосов
/ 07 декабря 2011

Ладно, ребята (и девочки;)) после двух часов возни с BindingUtils я наконец нашел решение своей проблемы. Два класса моделей могут оставаться такими, какие они есть, поэтому передача экземпляра FirstClass не обязательна. Простое связывание свойств значения FirstClass с полем значения MyClass работает должным образом, и значения в ArrayCollection также обновляются.

Итак, решение;

myClassObject = new MyClass();
myClassObject.label = "This is a label";
BindingUtils.bindProperty(myClassObject, "value", firstClassObject, "firstValue");

А затем просто добавьте myClassObject в коллекцию ArrayCollection.

Имейте в виду, что весь код здесь псевдокод, так что не забывайте о каких-либо опечатках.

Тем не менее, @Windowns, предлагающие передать объект FirstClass в MyClass, будут включены в мое окончательное решение, поскольку это значительно упрощает переключение между свойствами (FirstClass имеет много из них, а не только 4 в моем первом посте). Большое спасибо за это!

...