Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   передавать массив между двумя mxml файлами (http://www.flasher.ru/forum/showthread.php?t=148436)

qmel 31.12.2010 15:12

передавать массив между двумя mxml файлами
 
С наступающим!

Есть 2 mxml файла. Пусть файлы A и B. Первый (A) содержит HBox в котором делается
Код AS1/AS2:

var link:B = new B();

.

В приложении 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 01.01.2011 13:55

В файле B пишешь:

Код AS3:

import mx.core.FlexGlobals;
var Blink:B = FlexGlobals.topLevelApplication.link;
//or
var Blink:B = FlexGlobals.A.link;


alatar 02.01.2011 11:28

Astraport чему вы людей учите?
В классе "B" геттер/сеттер который будет принимать массив с параметрами для чекбоксов и отдавать изменившийся массив. При вызове "B" передавайте ему массив с параметрами. По-событию Close получайте из "B" изменившийся массив.

qmel 04.01.2011 12:35

Здравствуйте! С новым годом! Спасибо за ответы. Я решил воспользоваться советом alatar, пишу set и get методы. Но т.к. я новичок во флексе, есть 3 вопроса:
1. как обращаться к значениям массива из selected чекбокса ?
2. правильно ли я везде расставил модификаторы [Bindable] ?
3. у меня нет события Close у меня есть кнопки Save и Clear после нажатия окно закрывается и сохраняет/очищает галочки в чекбоксе, как в таком случае получать из B изменившийся массив, генерить event в функциях onSave() или onClear() ? А как его ловить в А тогда ?

Вот что я написал пока:

В файле A

Код AS3:

[Bindable]
public var arrayInA:ArrayCollection;
 
<mx:Button click="var linkToB: B = new B(); UIUtils.addPopUp(linkToB, ... as DisplayObject, true);
linkToB['arrayInB'] = arrayInA;"/>

В файле B
Код AS3:

[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()"/>

И верно ли я пытаюсь изменить значения массива этим - changeArray[i] = true; ?

alatar 04.01.2011 13:02

Цитата:

1. как обращаться к значениям массива из selected чекбокса ?
Зачем? В сеттере и установите значения для чекбоксов.
Код AS3:

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];
}

Цитата:

2. правильно ли я везде расставил модификаторы [Bindable] ?
В данном случае (как впрочем и в 99% других) байндинг не нужен.
Цитата:

генерить event в функциях onSave() или onClear() ? А как его ловить в А тогда ?
подписаться на это событие у linkToB, в обработчике получить массив у event.currentTarget (это и будет ваш "B")

Добавлено через 4 минуты
P.S. Вот это вот вы зачем сделали?
Код AS3:

linkToB['arrayInB'] = arrayInA;

У вас есть сеттер, через него и работайте, а переменная arrayInB должна быть приватной. Точнее она вообще не нужна.
Код AS3:

linkToB.changeArray = arrayInA;

Добавлено через 5 минут
PPS. И вот это замените:
Код AS3:

[Bindable]
public var arrayInA:ArrayCollection; //зачем эта переменная сделана публичной, вы ее используете вне класса "A"?

на
Код AS3:

private var arrayInA:Array;


qmel 04.01.2011 19:16

Учел все Ваши рекомендации и замечания, alatar. Теперь чекбокс при первом вызове окна отображается правильно. Но onClear пока ничего не очищает, видимо, я не смог правильно написать обработку пользовательского события. Кажется я не обновляю массив в A, хотя посылаю событие из B.

Вот мой код класса для пользователского события

Код AS3:

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);
  }
 }
}

Вот что пишу в файле B

Код AS3:

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);
}

В файле А

Код AS3:

import events.BEvent;
 
linkToB.addEventListener(BEvent.B_STRING, changeSettingsArray);
 
public function changeSettingsArray(event:BEvent):void{
  arrayInA = event.arrayOfBEvent;
}


alatar 04.01.2011 19:25

Можете просто передать null. Зачем восстанавливать значения по-умолчанию?

qmel 05.01.2011 10:50

Да, в onClear можно передавать пустой массив. А как это написать? Я торможу что-то.

А в функции onSave мне нужно передавать массив, содержащий выбранные пользователем значения чекбокса. Поэтому я и создал пользовательское событие.

Код AS3:

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);
}

Пока с передачей массива у меня не получилось, значения не обновляются.

alatar 05.01.2011 10:59

Цитата:

а, в onClear можно передавать пустой массив. А как это написать? Я торможу что-то.
Код AS3:

private function onClear():void {
  UIUtils.showMessage("Clear!");
  UIUtils.removePopUp(this);
 var bEvent:BEvent = new BEvent(BEvent.B_STRING, changeArray);
 bEvent.arrayOfBEvent = null;
 dispatchEvent(bEvent);
}

Цитата:

Пока с передачей массива у меня не получилось, значения не обновляются.
Вы геттер для changeArray изменили, как я писал?

qmel 05.01.2011 12:43

Да, я сразу же изменил геттер как только Вы мне это посоветовали.
Большое спасибо, Вам за помощь, alatar.
Я изменил onClear(), стал передавать null. Все работает! (и Clear и Save).

P.S: Напоследок, вы не подскажите, нужна ли запись

Код AS3:

<mx:Metadata>
    [Event(name="b_event",type="events.BEvent")]
</mx:Metadata>

В файле В. Работает вроде бы и без нее. Хочу узнать это, чтоб знать на будущее как правильно и красиво писать пользовательские события.


Часовой пояс GMT +4, время: 21:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.