Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Почему все свойства объекта получают тип "object" ? (http://www.flasher.ru/forum/showthread.php?t=90328)

Annihilator 09.01.2007 15:56

нет, ты немного не понял.
В примере выше объект "х" - это xml-объект, в котором доступ к значениям осуществляется через nodeValue.
Метод toObject возвращает стандартный флешовый объект с обычными свойствами/значениями, т.е. "x" и "xmlobj" - разные объекты по сути и по классам.

В случае нескольких тегов с одинаковым именем, метод создаёт свойство-массив. Например:
Код:

s = '<?xml version="1.0" ?>
<top>
<item name="one" id="23">first</item>
<item name="two" link="www.google.com">first</item>
<item param="Node 2 attribute">
        <some>777</some>
        <thing>qwerty</thing>
</item>
<item name="four">4 all</item>
</top>';
var x:XML=new XML();
x.ignoreWhite=true; // это обязательно задавать
x.parseXML(s);
var obj = x.toObject();
// дальше обращаться к свойствам созданого объекта obj
// например, чтобы прочесть значение узла <thing> :
trace(obj.top.item[2].thing); // выводит  qwerty


etc 09.01.2007 16:06

Нет, я все-равно не понимаю, зачем все эти преобразования и перемешивания данных? Облегчить жизнь? Скорее усложнить, о чем и свидетельствует эта тема…

Annihilator 09.01.2007 16:16

Да, а как ты обратишься к значению узла <thing> вышепреведеного xml-a?

etc 09.01.2007 16:25

Изменил бы архитектуру таким образом, чтобы одному логическому элементу не пришлось бы обращаться глубже своих детей. Не говоря уже о том, что была бы четкая структура XML, с определенными правилами построения.

iNils 09.01.2007 17:43

Цитата:

Сообщение от Annihilator
Да, а как ты обратишься к значению узла <thing> вышепреведеного xml-a?

Основа:
Код:

function getNode (node, name) {
        for (var i = 0; i < node.childNodes.length; i++) {
                if (node.childNodes[i].nodeName.toLowerCase () == name.toLowerCase ()) {
                        return node.childNodes[i];
                }
        }
};


Iv 09.01.2007 20:40

Ажно руки зачесались дописать книгу про XML.

Пара советов:
- etc дело говорит: преобразовывать стандартный объект (XML) в нестандартный дело сомнительное.

- чтобы достучаться до значения атрибута и получить его в нужном тебе типе, просто сделай методы конвертации/доступа. Поскольку расширить XMLNode своим классом нерентабельно, лучше юзать композицию. К примеру, желаем получить доступ к значению атрибута как к массиву:
(пример не рабочий, просто как принцип)
Код:

class XMLUtils {

 public static function getAttributeArray (node:XMLNode, name:String):Array {
 var arrtributes_obj:Object = node.attributes;
  if (typeof arrtributes_obj[name] == "string") {
  arrtributes_obj[name] = arrtributes_obj[name].split(",");
  }
  return arrtributes_obj[name];
 }

  .......

}

соответственно, ты этим методом спокойно получаешь атрибут узла как массив. То же самое делаешь для Number и др.

- разберись со своим стандартом XML, сделай правильную структуру. Работа с данными не должна быть в виде длинных иерархических обращений. Передавай узлы на обработку экземплярам, а не управляй ими централизованно. К примеру, у тебя на сцене несколько персонажей, привязанных к юзерам. Их состояние апдейтится из XML.
Тогда лучше сделать XML вида:
Код:

<state>
  <user id="iv">
    <action name="jumpLeft" arguments="10,12">
    <action name="totalWin" arguments="350">
  </user>
  <user id="etс">
    <action name="jumpDown" arguments="10,-30">
    <action name="totalLose" arguments="-200">
  </user>
</state>

далее, при получении данных, просто пробегаем по нодам первого уровня и раздаем их на обработку экземплярам:
Код:

private function onLoad (ok) {
....

  var node:XMLNode = this.firstChild.firstChild;
  while (node) {
    var id:String = XMLUtils.getAttributeString(node, "id");
    UserClass.updateInstance(id, node);
    node = node.nextSibling;
  }
}

Следующий этап - обработка полученных данных экземплярами:
Код:

class UserClass {

  private static var __users:Object;

  public static function updateInstance (id:String, node:XMLNode):Void {
    var user:UserClass = __users[id];
    user.updateState(node);
  }

  .....

  private function updateState(node:XMLNode):Void {
    node = node.firstChild;
    while (node) {
      var action_name:String = XMLUtils.getAttributeString(node, "name");
      var action:Function = this[action_name];
      var arguments_arr:Array = XMLUtils.getAttributeArray(node, "arguments");
      if (action) {
        action.apply(this, arguments_arr);
      }
      node = node.nextSibling
    }
  }

  private function jumpLeft (distance:Number, height:Number):Void {
      distance = Number(distance) || 0;
      height = Number(height) || 0;
      ......
  }

}

- собственно проверка и приведение типов также должны быть и непосредственно в методе-обработчике (мали ли откуда еще придется его вызывать).


Резюмируем:
- получили данные в приложение
- в приложении раскидали по экземплярам
- в экземплярах раскидали по обработчикам
- в обработчиках проверили типы, привели к нужным
- выполнили действия.

код выше - не рабочий, просто иллюстрация.
- оч тяжело писать код прямо здесь... три раза правил :)

Iv 09.01.2007 20:54

Да, обрати внимание, что нигде в коде не обращаемся к узлам - детям детей.
Исключение в onLoad, да и то потому, что this - пустой.
Второе исключение я допускаю для текстовых узлов в обращениях вида:
node.firstChild.nodeValue;
все остальные случаи - признак неидеальной организации проекта :)

Fl00r 09.01.2007 20:59

жаль тут в мемориз низзя.

WindWalker 16.07.2007 15:51

Цитата:

Сообщение от iNils
Основа:
Код:

function getNode (node, name) {
        for (var i = 0; i < node.childNodes.length; i++) {
                if (node.childNodes[i].nodeName.toLowerCase () == name.toLowerCase ()) {
                        return node.childNodes[i];
                }
        }
};


Пробегать по циклу ради каждого нода?
А если несколько нодов с одинаковым именем?

etc 16.07.2007 15:53

Цитата:

Сообщение от WindWalker
А если несколько нодов с одинаковым именем?

Этот вопрос задан мною в конце первой страницы. А в начале второй ответ на него.


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

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