|
|
|||||
Modus ponens
|
Передать ссылку на ХМЛ...
Вот, столкнулся с дурацкой задачей =) Нужно передать в функцию в качестве параметра ссылку на ХМЛ, думал, что если сделать так:
var my_xml:XML = new XML(); function my_fn(_xml:XML){ // изменяем что-то в ХМЛе _xml = ...; // присваеваем тут ему какое-то новое значение } my_fn(my_xml); trace(my_xml); // а вот и индейская хижина, ничего не поменялось var my_xml:XML = new XML(); function my_fn(_xml:XML){ // изменяем что-то в ХМЛе _root.my_xml = ...; // присваеваем тут ему какое-то новое значение } my_fn(my_xml); trace(my_xml); // трейсится как и ожидалось, с изменениями Мож у кого есть какие соображения? Или я чего-то совсем заработался... %)
__________________
Hell is the possibility of sanity |
|
|||||
ветеран форума
|
Ты же меняешь внутреннюю переменную функции! Сделай тип возвращаемого значения для функции хмл и его присваивай.
Это работает: ЗЫ мне тоже всегда казалось что хмл копируется по ссылке |
|
|||||
Modus ponens
|
Ну, дык фишка в том, что если передать мувик таким же образом, то все трансформации описанные в функции произойдут именно с ним... вот я и подумал, что по аналогии ХМЛ тоже так же должен себя вести...
Эта функция - конструктор класса, так что возвращать ХМЛ не получится... пока что ограничился тем, что передаю ссылку на клип содержащий итоговый ХМЛ и название переменной содержащей итоговый ХМЛ... но выглядит как-то не очень... хотелось бы более человеческий способ =( Вот полный код, раз уж на то пошлО: класс XMLloader class XMLloader extends XML { public var _path:String = "xmldata/"; public var tgt:XML; function XMLloader(s:String, tgt:String, mc:MovieClip) { this.ignoreWhite = true; this.onLoad = function(ok:Boolean) { if(ok){ mc[tgt] = splitAttr(this); } }; this.load(_path+s); } function splitAttr(_xml:XML):XML { var _tempXML:XML = new XML(); var _fNode:XMLNode = _tempXML.createElement("f"); for (var i = 0; i<_xml.childNodes[0].childNodes.length; i++) { var _sNode:XMLNode = _tempXML.createElement("s"); var _arr:Array = _xml.childNodes[0].childNodes[i].attributes.a.split("#"); _sNode.attributes.X = _arr[0]; _sNode.attributes.Y = _arr[1]; _sNode.attributes.NAME = _arr[2]; _sNode.attributes.DESCRIPTION = _arr[3]; _sNode.attributes.IMAGE = _arr[4]; _sNode.attributes.HOMEPAGE = _arr[5]; _fNode.appendChild(_sNode); } _tempXML.appendChild(_fNode); return _tempXML; } } var _nxml:XML = new XML(); var _lxml:XMLloader = new XMLloader("description.xml", "_nxml", this); var testButton:MovieClip = _root.attachMovie("move_at", "testButton", _root.getNextHighestDepth(), {_x:300, _y:300}); testButton.onRelease = function(){ trace("result "+_root._nxml.toString()); } Возможно есть просто другой подход?.. потому что так как-то не очень хорошо...
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 14.10.2006 в 20:49. |
|
|||||
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
2 wvxvw:
Я думаю, как вариант, можно попробовать Function.apply... Вроде того: А в функции splitAttr обращаться не к _xml, а к this. Ну и параметры из функции убрать. Если вас такой вариант устроит, конечно... Самому проверять, пройдёт ли такой вариант мне лень. ^_^ Напишите потом о результатах, пожалуйста, потому как эта тема мне тоже интересна.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
Modus ponens
|
class XMLloader extends XML { public var _path:String = "xmldata/"; public var tgt:XML; function XMLloader(s:String) { this.ignoreWhite = true; this.onLoad = function(ok:Boolean) { if(ok){ splitAttr(); } }; this.load(_path+s); } function splitAttr(){ var _tempXML:XML = new XML(); var _fNode:XMLNode = _tempXML.createElement("f"); for (var i = 0; i<this.childNodes[0].childNodes.length; i++) { var _sNode:XMLNode = _tempXML.createElement("s"); var _arr:Array = this.childNodes[0].childNodes[i].attributes.a.split("#"); _sNode.attributes.X = _arr[0]; _sNode.attributes.Y = _arr[1]; _sNode.attributes.NAME = _arr[2]; _sNode.attributes.DESCRIPTION = _arr[3]; _sNode.attributes.IMAGE = _arr[4]; _sNode.attributes.HOMEPAGE = _arr[5]; _fNode.appendChild(_sNode); } _tempXML.appendChild(_fNode); this.parseXML(_tempXML.toString()); } } В принципе проблема решилась, но если будут какие-нибудь интересные идеи - с удовольствием почитаю =)
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Sep 2006
Сообщений: 256
|
var rebuildXML:Function = function(xml:XML):XML { var nodeToAdd:XMLNode = xml.createElement("newnode"); var child:XMLNode = xml.firstChild; child.attributes["a"]=99; xml.appendChild(nodeToAdd); return xml; } var xml:XML = new XML() var textnode:XMLNode = xml.createElement("textnode"); textnode.attributes["a"]=0; xml.appendChild(textnode); trace(xml); //<textnode a="0" /> var newxml:XML = rebuildXML(xml); trace(newxml);//<textnode a="99" /><newnode /> |
|
|||||
Modus ponens
|
2 lowka:
Дык =) так-то понятно =) но это совсем не ответ на вопрос =) Вопрос был в том, как передать ссылку на ХМЛ вместо того, чтобы передавать его значение. Т.е. лучше на примере с обжектом понятно: var obj:Object = {}; function my_fn(){ trace(typeof(arguments[0])+" "+arguments[0].A+" "+arguments[0].B); arguments[0].A = arguments[0].B; trace(obj.A+" "+obj.B); } obj = {A:1, B:2}; my_fn(obj); //object 1 2 // 2 2 // свойство переопределилось у объекта, на который была ссылка my_fn({A:obj.A, B:obj.B}); //object 1 2 // 1 2 // свойство, ессна не переопределилось, потому что было передано значение, а не ссылка
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 15.10.2006 в 00:18. |
Часовой пояс GMT +4, время: 14:41. |
|
« Предыдущая тема | Следующая тема » |
|
|