Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 31.12.2010, 15:12
qmel вне форума Посмотреть профиль Отправить личное сообщение для qmel Найти все сообщения от qmel
  № 1  
Ответить с цитированием
qmel

Регистрация: Dec 2010
Сообщений: 23
По умолчанию передавать массив между двумя 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: если кто знает, приведите пожалуйста пример кода

Старый 01.01.2011, 13:55
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 2  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
В файле B пишешь:

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

Старый 02.01.2011, 11:28
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 3  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Astraport чему вы людей учите?
В классе "B" геттер/сеттер который будет принимать массив с параметрами для чекбоксов и отдавать изменившийся массив. При вызове "B" передавайте ему массив с параметрами. По-событию Close получайте из "B" изменившийся массив.

Старый 04.01.2011, 12:35
qmel вне форума Посмотреть профиль Отправить личное сообщение для qmel Найти все сообщения от qmel
  № 4  
Ответить с цитированием
qmel

Регистрация: Dec 2010
Сообщений: 23
Здравствуйте! С новым годом! Спасибо за ответы. Я решил воспользоваться советом 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; ?

Старый 04.01.2011, 13:02
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 5  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
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;


Последний раз редактировалось alatar; 04.01.2011 в 13:10.
Старый 04.01.2011, 19:16
qmel вне форума Посмотреть профиль Отправить личное сообщение для qmel Найти все сообщения от qmel
  № 6  
Ответить с цитированием
qmel

Регистрация: Dec 2010
Сообщений: 23
Учел все Ваши рекомендации и замечания, 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;
}

Старый 04.01.2011, 19:25
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Можете просто передать null. Зачем восстанавливать значения по-умолчанию?

Старый 05.01.2011, 10:50
qmel вне форума Посмотреть профиль Отправить личное сообщение для qmel Найти все сообщения от qmel
  № 8  
Ответить с цитированием
qmel

Регистрация: Dec 2010
Сообщений: 23
Да, в 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);
}
Пока с передачей массива у меня не получилось, значения не обновляются.

Старый 05.01.2011, 10:59
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 9  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
а, в 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 изменили, как я писал?

Старый 05.01.2011, 12:43
qmel вне форума Посмотреть профиль Отправить личное сообщение для qmel Найти все сообщения от qmel
  № 10  
Ответить с цитированием
qmel

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

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

Код AS3:
<mx:Metadata>
    [Event(name="b_event",type="events.BEvent")] 
</mx:Metadata>
В файле В. Работает вроде бы и без нее. Хочу узнать это, чтоб знать на будущее как правильно и красиво писать пользовательские события.

Создать новую тему Ответ Часовой пояс GMT +4, время: 16:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
ArrayCollection , checkbox , child , data binding , parent
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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