2012-05-08 3 views
0

В Flex (Flash Builder 4) мне нужен способ узнать, изменилось ли что-то в коллекции массива.Flex - как определить, изменился ли объект DATA?

У меня есть пользовательский объект:

[Bindable] общественный вар _myobject: MyObject;

В основном это класс, содержащий кучу различных свойств String и Number.

Мне нужен надежный способ узнать, было ли изменено какое-либо из свойств. Например, я привязываю свойства к пользовательскому интерфейсу (полям), но некоторые свойства могут также меняться с помощью кода.

Есть ли способ сделать это? Я нашел ChangeWatcher, но похоже, что он смотрит только на одно простое свойство, такое как String или Number. Мне нужно следить или обнаруживать изменения во всех свойствах моего объекта, надеюсь, без необходимости добавлять события ChangeWatcher к каждому свойству. Это возможно?

+0

если есть много свойств объектов, которые могут изменяться с помощью кода, вам лучше вручную ногами события изменения всякий раз, когда вы что-либо изменить. – Kamal

+0

Итак, везде, где я делаю изменения в коде, мне нужно добавить код активации событий ... Что касается экрана со всеми свойствами, связанными с полями, нужно ли добавлять события «Событие» в каждое поле или нет более простого способа обнаружить, что мой объект изменился при изменении свойства в моем объекте? –

+0

хорошо .. есть небольшое обходное решение, которое уменьшит усилия для вас, по крайней мере, в некоторой степени. Предполагая, что ваши свойства объекта не являются динамическими .. создайте объект с помощью ручного набора для всех свойств .. и любой вызов вызова setter общая функция, которая отправляет событие для любого свойства, которое было изменено .. вот как слушатели смены свойств работают в flex. (если они не ошибаются, они выполняют настройку во время компиляции), поэтому даже если объект привязан к полям на экране, вы не Не нужно беспокоиться об изменениях. – Kamal

ответ

1

Вам, вероятно, лучше всего отправлять события привязки по конкретным свойствам, которые вы хотите связывать. Еще лучше отправьте событие привязки, так что все связанные вещи не должны фильтровать для «это свойство, о котором я забочусь?» С Flash Builder 4.5 это очень просто сделать, просто выберите имя переменной и нажмите Ctrl-1, выберите «Create getter and setter», выберите getter и setter и проверьте «Bindable» и «create custom event».

Это создаст для вас код, который выглядит примерно так:

private var _yourProperty:String; 

[Bindable (event='yourPropertyChange')] 
public function get yourProperty():String { 
    return _yourProperty; 
} 

public function set yourProperty(value:String):void { 
    if (value !=== _yourProperty) { 
    _yourProperty = value; 
    dispatchEvent(new Event('yourPropertyChange')); 
    } 
} 

Это будет гораздо менее многословным и более производительным, чем код, Flash Builder создает для вас за кулисами, когда вы просто использовать Привязываемое тег сам по себе.

0

Если вы используете определенные классы как VO/DAO и применяете тег [Bindable] к классу, это будет привязывать ко всем свойствам для вас (пока они будут прочитаны/записаны).

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

Супер базовый пример: ключ должен привязать его к диспетчеру, поэтому он может отправить PropertyChangeEvent.

[Bindable] 
public class Actor extends EventDispatcher 
{ 
     public var fName:String; 
     public var lName:String; 
     public var age:uint; 

     public function get displayName():String 
     { 
      return lName +', '+ fName; 
     } 

     public function Actor() 
     { 
      super(); 
     } 
} 
+0

Это выглядит многообещающим, просто чтобы убедиться, что я следую, как выглядит код в скрипте, который использует и хочет обнаружить изменения на этом объекте? Это addEventListener? –

+0

Это зависит в конечном счете от того, что его использует: если это mxml (в представлении), просто используйте идентификатор привязки: фигурные скобки {}. Если он находится в AS, вы можете добавить слушателя в «actor» для PropertyChangeEvent. Если вы хотите улучшить это до еще большей детализации, удалите [Bindable] из класса и поместите их в свойства, которые вы хотите посмотреть. Вы также можете сказать, какое событие ожидать, используя идентификатор события: [Bindable (event = "myfancyevent")], но вам нужно отправить его сами. Больше информации здесь: http://livedocs.adobe.com/flex/3/html/help.html?content=metadata_3.html –

0
public class BindableDictionary extends EventDispatcher { 
     public function BindableDictionary() { 
      super(); 
     } 

     public var dictionary:Dictionary = new Dictionary(); 

     [Bindable("change")] 
     public function get(key:Object):Object { 
      return dictionary[key]; 
     } 

     public function put(key:Object, value:Object):void { 
      dictionary[key] = value; 
      dispatchEvent(new Event(Event.CHANGE)); 
     } 
    } 

может быть, этот класс даст вам какую-то новую идею,

Смежные вопросы