|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2010
Сообщений: 23
|
передавать массив между двумя mxml файлами
С наступающим!
Есть 2 mxml файла. Пусть файлы A и B. Первый (A) содержит HBox в котором делается . В приложении HBox из А это часть главного окна, из которого по конопке вызывается модальное окно B, которое содержит checkbox-ы. Сразу после загрузки приложения при первом открытии окна B все checkbox-ы выбраны. Пользователь какие-то галочки оставил, какие-то снял. Нажал ОК. Нужно запомнить состояние checkbox-ов, чтоб при повторном вызове окна B (в этой же сессии работы с гл. приложением) показывать галочки только на сохраненных checkbox-ах. Для этого я хочу создать массив в A. Разделяемый для A и B. В который бы сохранялись (true/false) значения из selected checkbox-ов окна B. И чтоб из B я мог менять значения в массиве в A. Вопрос: как это сделать? P.S: Читал про data binding, методы get, set, посылаемые сообщения от родителя к потомку и наоборот и не знаю что из этого, а главное как применить. Передавать в event массив каждый раз?.. P.S2: если кто знает, приведите пожалуйста пример кода |
|
|||||
Astraport чему вы людей учите?
В классе "B" геттер/сеттер который будет принимать массив с параметрами для чекбоксов и отдавать изменившийся массив. При вызове "B" передавайте ему массив с параметрами. По-событию Close получайте из "B" изменившийся массив. |
|
|||||
Регистрация: Dec 2010
Сообщений: 23
|
Здравствуйте! С новым годом! Спасибо за ответы. Я решил воспользоваться советом alatar, пишу set и get методы. Но т.к. я новичок во флексе, есть 3 вопроса:
1. как обращаться к значениям массива из selected чекбокса ? 2. правильно ли я везде расставил модификаторы [Bindable] ? 3. у меня нет события Close у меня есть кнопки Save и Clear после нажатия окно закрывается и сохраняет/очищает галочки в чекбоксе, как в таком случае получать из B изменившийся массив, генерить event в функциях onSave() или onClear() ? А как его ловить в А тогда ? Вот что я написал пока: В файле A [Bindable] public var arrayInA:ArrayCollection; <mx:Button click="var linkToB: B = new B(); UIUtils.addPopUp(linkToB, ... as DisplayObject, true); linkToB['arrayInB'] = arrayInA;"/> [Bindable] public var arrayInB:ArrayCollection; [Bindable] public function get changeArray():ArrayCollection { return arrayInB; } public function set changeArray(val:ArrayCollection):void { arrayInB = val; } private function onClear():void { UIUtils.showMessage("Clear!"); UIUtils.removePopUp(this); for (var i:int = 0; i < 9; i++) { changeArray[i] = false ; } } private function onSave():void { if (one.selected) changeArray[1] = true; if (two.selected) changeArray[2] = true; if (three.selected) changeArray[3] = true; UIUtils.showMessage("Save!"); UIUtils.removePopUp(this); } <mx:CheckBox id="one" label="one" selected="@{changeArray.getItemAt(1)}"/>//чекбокс не отображает правильно данные из массива arrayInA даже до изменений (когда все значения в массиве true) <mx:CheckBox id="two" label="two" selected="@{changeArray.getItemAt(2)}"/> <mx:CheckBox id="three" label="three" selected="@{changeArray.getItemAt(3)}"/> <mx:Button label="Clear" click="onClear()" <mx:Button label="Save" click="onSave()"/> |
|
|||||
Цитата:
public function set changeArray(val:Array):void //Зачем вам тут ArrayCollection? { if (val) { one.selected = val[0]; two.selected = val[1]; three.selected = val[2]; } } public function get changeArray():ArrayCollection { return [one.selected, two.selected, three.selected]; } Цитата:
Цитата:
Добавлено через 4 минуты P.S. Вот это вот вы зачем сделали? У вас есть сеттер, через него и работайте, а переменная arrayInB должна быть приватной. Точнее она вообще не нужна. Добавлено через 5 минут PPS. И вот это замените: [Bindable] public var arrayInA:ArrayCollection; //зачем эта переменная сделана публичной, вы ее используете вне класса "A"? Последний раз редактировалось alatar; 04.01.2011 в 13:10. |
|
|||||
Регистрация: Dec 2010
Сообщений: 23
|
Учел все Ваши рекомендации и замечания, alatar. Теперь чекбокс при первом вызове окна отображается правильно. Но onClear пока ничего не очищает, видимо, я не смог правильно написать обработку пользовательского события. Кажется я не обновляю массив в A, хотя посылаю событие из B.
Вот мой код класса для пользователского события package events { import flash.events.Event; public class BEvent extends Event { public static const B_STRING:String = "Selected Items"; public var arrayOfBEvent:Array; public function BEvent(type:String, arrayOfBEvent:Array) { super(type); this.arrayOfBEvent = arrayOfBEvent; } override public function clone():Event { return new BEvent(type, arrayOfBEvent); } } } import events.BEvent; <mx:Metadata> [Event(name="b_event",type="events.BEvent")] </mx:Metadata> private function onClear():void { UIUtils.showMessage("Clear!"); UIUtils.removePopUp(this); for (var i:int = 0; i < 9; i++) { changeArray[i] = false ; } var bEvent:BEvent = new BEvent(BEvent.B_STRING, changeArray); bEvent.arrayOfBEvent = changeArray; dispatchEvent(bEvent); } |
|
|||||
Регистрация: Dec 2010
Сообщений: 23
|
Да, в onClear можно передавать пустой массив. А как это написать? Я торможу что-то.
А в функции onSave мне нужно передавать массив, содержащий выбранные пользователем значения чекбокса. Поэтому я и создал пользовательское событие. private function onSave():void { if (one.selected) changeArray[1] = true; if (two.selected) changeArray[2] = true; if (three.selected) changeArray[3] = true; UIUtils.showMessage("Save!"); UIUtils.removePopUp(this); var bEvent:BEvent = new BEvent(BEvent.B_STRING, changeArray); bEvent.arrayOfBEvent = changeArray; dispatchEvent(bEvent); } |
|
|||||
Цитата:
private function onClear():void { UIUtils.showMessage("Clear!"); UIUtils.removePopUp(this); var bEvent:BEvent = new BEvent(BEvent.B_STRING, changeArray); bEvent.arrayOfBEvent = null; dispatchEvent(bEvent); } Цитата:
|
|
|||||
Регистрация: Dec 2010
Сообщений: 23
|
Да, я сразу же изменил геттер как только Вы мне это посоветовали.
Большое спасибо, Вам за помощь, alatar. Я изменил onClear(), стал передавать null. Все работает! (и Clear и Save). P.S: Напоследок, вы не подскажите, нужна ли запись В файле В. Работает вроде бы и без нее. Хочу узнать это, чтоб знать на будущее как правильно и красиво писать пользовательские события. |
Часовой пояс GMT +4, время: 16:02. |
|
« Предыдущая тема | Следующая тема » |
Теги |
ArrayCollection , checkbox , child , data binding , parent |
Опции темы | |
Опции просмотра | |
|
|