Flex: назначение событий динамически создаваемым кнопкам
Спасибо Уэззи и остальным, кто помог мне за последние пару дней. Я следовал их советам и пытался выяснить все остальное самостоятельно, но я снова застрял.
У меня есть текстовый файл, структурированный так:
button1_label
button2_label
button3_label
Моя программа создает эти 3 кнопки во время выполнения и помещает их в группу.
protected function onLoaded(e:Event):void {
var myArrayOfLines:Array = e.target.data.split(/\n/);
var tempBtn:Button;
for(var i:Number = 0;i < myArrayOfLines.length;i++){
var j:Number = i+1;
tempBtn = new Button();
tempBtn.id = "btn" + i;
tempBtn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void{
var index:uint = parseInt(evt.currentTarget.id.replace("btn", ""));
//TextArea code will go here
trace(text); // Traces null
});
tempBtn.label = myArrayOfLines[i];
btnArray.push(tempBtn);
group.addElement(btnArray[i]);
}
}
Теперь из моего кода видно, что я пытаюсь заставить каждую кнопку печатать строку в текстовой области. Я структурировал мой новый button.txt так:
button1_label
"Hello"
button2_label
"Goodbye"
button3_label
"Come again"
Так что я хочу сделать, чтобы button1 напечатал "Hello". Все строки файла.txt помещаются в myArrayOfLines. Заранее благодарю за любую помощь.
РЕДАКТИРОВАТЬ Полное объяснение
Извините, я пытался упростить свой вопрос, думаю, мне стало сложнее понять. Я сделал текстовый редактор, чем работает на стороне клиента, без сервера. У меня есть набор кнопок, которые вставляют предопределенные фразы в TextArea. У каждой кнопки есть прослушиватель, который выполняет myTextArea.insert("sometext"); (но разный текст для каждой кнопки. Пользователи запросили возможность создавать свои собственные кнопки, чтобы вставить туда свои строки. Я подумал, что у меня будет пара текстовых входов, где пользователь может определить метку, и строка, которая будет вставлена в textarea при нажатии кнопки. Я бы записал метку в одну строку, затем строку в следующую строку. Прямо сейчас я создал файл buttons.txt с этим форматом, чтобы посмотреть, будет ли он работать.
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: РАБОЧИЙ КОД
public function setupBtns(e:Event):void{
var file:File = File.documentsDirectory.resolvePath("buttons.txt");
var stream:FileStreamWithLineReader = new FileStreamWithLineReader();
stream.open(file, FileMode.READ);
while(stream.bytesAvailable) {
// this line contains the headers like button1_label etc.
var label:String;
// this line contains the string
if(stream.bytesAvailable) {
// this line contains the actual label like "Hello";
label = stream.readUTFLine();
line = stream.readUTFLine();
// strip off the first and last character as they are double quotes
line = line.substring(1, line.length-1);
var tempBtn:Button = new Button();
tempBtn.addEventListener(MouseEvent.CLICK, btnListener);
tempBtn.label = label;
tempBtn.name = line;
btnArray.push(tempBtn);
for(var i:Number = 0;i<btnArray.length;i++){
group.addElement(btnArray[i]);
}
}
}
}
protected function btnListener(e:MouseEvent):void{
mainTextField.insertText(e.target.name);
trace(e.target.name);
}
2 ответа
Попробуйте это и дайте мне знать, как это работает...
РЕДАКТИРОВАТЬ: (попробуйте новый код ниже)
protected function onLoaded(e:Event):void {
var myArrayOfLines:Array = e.target.data.split(/\n/);
var tempBtn:Button;
for(var i:Number = 0;i < myArrayOfLines.length;i=i+1){
var j:Number = i+1;
tempBtn = new Button();
tempBtn.id = "btn" + i;
tempBtn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void{
myTextArea.text += '\n' + myArrayOfLines[j];
});
tempBtn.label = myArrayOfLines[i];
btnArray.push(tempBtn);
group.addElement(btnArray[btnArray.length-1]);
}
}
Во-первых: не используйте анонимные функции в качестве слушателей в ActionScript - если вы не можете их удалить позже.
вместо этого используйте метод класса следующим образом:
tempBtn.addEventListener(MouseEvent.CLICK, onMouseClick);
private function onMouseClick(evt:MouseEvent):void
{
if (evt.currentTarget == button1_label)
{
// do sth for btn1
}
else if (evt.currentTarget == button2_label)
{
// do sth for btn2
}
// ...
}
редактировать
только что увидел, что вы используете идентификаторы, а затем просто измените приведенный выше код на что-то вроде этого:
if (evt.currentTarget.id == "btn1")