PDA

Просмотр полной версии : Аналог функции eval() в php


asuri
22.02.2007, 18:50
Всем привет.
Есть задача следующего рода:
с сервера присылается некий текст и служебная информация, в зависимости от которой, текст должен отображаться в разных компонентах (textaria, TextInput, label и т.д.)
Допустим в некоторый момент времени я решу написать ещё какой то свой компонент и захочу чтоб текст отображался в нём. Так вот вопрос, как бы мне сделать так, что бы при этом не надо было перекомпиливать весь проект.

Вот в PHP например есть функция eval(), которая принимает на входе произвольный код и исполняет его. Есть ли что то похожее во флексе?

если нет, то можно ли компилить компоненты в отдельные swf-ники, а потом подключать в основном аппликейшене???

Помогите плиз найти рациональное решение.

Nirth
23.02.2007, 03:18
Написать рантайм компилятор.

Скрипун
23.02.2007, 09:45
ответ нет. eval () тут очень упрощенная и это делать не умеет.

asuri
23.02.2007, 21:06
Я решил делать так:передавать типа компонента в функцию, там его создавать , задавать ему всякие свойства и потом уже делать addchild() в какой нить hbox или vbox. Тока у меня опять не всё получается


...
public function CreateComponent(c_type:String):Object{
var Component:Object;
if(c_type=='TextInput'){
Component=new TextInput();
}else if(c_type=='TextArea'){
Component=new TextArea();
}else if(c_type=='RichTextEditor'){
Component=new RichTextEditor();
}
return Component;
}
...
hBox_1.addChild(CreateComponent('TextInput'));
...

пишет ошибку 1118: Implicit coercion of a value with static type Object to a possibly unrelated type flash.display:DisplayObject.

etc
23.02.2007, 21:08
Дык, напиши в типе возврата DisplayObject

asuri
23.02.2007, 21:21
а я написал по другому
hBox.addChild(DisplayObject(CreateComponent('TextInput')));
Так не правильно?

etc
23.02.2007, 21:38
А что, написать правильный тип возврата сложнее было? Кастить зачем? Они и так наследуются от DisplayObject, зачем кастить лишний раз…

Только уж тогда
public function createComponent(componentType:String):DisplayObject {
switch (componentType) {
case 'TextInput':
return new TextInput();
break;
case 'TextArea':
return new TextArea();
break;
case 'RichTextEditor':
return new RichTextEditor();
break;
default:
return null;
}
}

з.Ы. С прописной буквы именуются классы, а не методы и переменные.

__i
23.02.2007, 23:20
гы гы шлабаки, никакоего изврата( настоящий изврат:

private var classes : Object = {'TextInput' : TextInput,
'TextArea' : TextArea }

public function createComponent(componentType:String):DisplayObject
{
if (classes[componentType]!=null)
{
return new classes[componentType]();
}
else
{
//'ТУТ ВСЕРАВНО НЕЛЬЗЯ НУЛ возвращать ) т.к. нул не аттачиться )';
return null;
}
}

etc
23.02.2007, 23:22
Ну пусть new Shape хотя б…

Nirth
23.02.2007, 23:26
Не нужно ничего возвращать, перед return надо написть throw new Error('No Such Class');
ибо в mx.core.Contaiener можно дабавлять только IUIComponent(контейнер должен уметь алайнить компоненты, в IUIComponent заложено это) а плодить лишние IUIComponent'ы это издевательство над оперативкой.

etc
23.02.2007, 23:52
Неплохо было бы сначала проверить перед аттачем, null или нет.

asuri
25.02.2007, 19:17
Ок, спс. Всё работает )