Просмотр полной версии : Аналог функции eval() в php
Всем привет.
Есть задача следующего рода:
с сервера присылается некий текст и служебная информация, в зависимости от которой, текст должен отображаться в разных компонентах (textaria, TextInput, label и т.д.)
Допустим в некоторый момент времени я решу написать ещё какой то свой компонент и захочу чтоб текст отображался в нём. Так вот вопрос, как бы мне сделать так, что бы при этом не надо было перекомпиливать весь проект.
Вот в PHP например есть функция eval(), которая принимает на входе произвольный код и исполняет его. Есть ли что то похожее во флексе?
если нет, то можно ли компилить компоненты в отдельные swf-ники, а потом подключать в основном аппликейшене???
Помогите плиз найти рациональное решение.
Написать рантайм компилятор.
ответ нет. eval () тут очень упрощенная и это делать не умеет.
Я решил делать так:передавать типа компонента в функцию, там его создавать , задавать ему всякие свойства и потом уже делать 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.
Дык, напиши в типе возврата DisplayObject
а я написал по другому
hBox.addChild(DisplayObject(CreateComponent('TextInput')));
Так не правильно?
А что, написать правильный тип возврата сложнее было? Кастить зачем? Они и так наследуются от 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;
}
}
з.Ы. С прописной буквы именуются классы, а не методы и переменные.
гы гы шлабаки, никакоего изврата( настоящий изврат:
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;
}
}
Ну пусть new Shape хотя б…
Не нужно ничего возвращать, перед return надо написть throw new Error('No Such Class');
ибо в mx.core.Contaiener можно дабавлять только IUIComponent(контейнер должен уметь алайнить компоненты, в IUIComponent заложено это) а плодить лишние IUIComponent'ы это издевательство над оперативкой.
Неплохо было бы сначала проверить перед аттачем, null или нет.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.