Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Flex XML Data Editing (http://www.flasher.ru/forum/showthread.php?t=121339)

Terricks 13.02.2009 15:42

Flex XML Data Editing
 
Добрый день,

Вопрос следующий:
Есть HTTPService с id="srv", которому по GET приходят xml-данные e4x.
Есть Grid, в который можно прописать в dataProvider = '{srv.lastResult.root.node}' и все в гриде будет отображаться.

Теперь же мне нужно измененные в гриде данные отправить обратно на сервер. И еще сделать так, чтобы dataProvider = ссылался не на srv.***, а на, скажем, функцию типа гет, которая возвращает svr.lastResult.root.node. Т.е. dataProvider = '{varXML}', где varXML имеет вид
Код:

private function get varXML()
{
    return srv.lastResult.root.node;
}

Так вообще можно сделать? Когда в dataProvider стоит {srv.lastResult.root.node}, то после запроса данных они появляются в гриде. Когда же там прописана функция типа гет varXML, то ничего не появляется после отрабатывания запроса. Т.е. dataProvider не запрашивает данные у varXML, но HTTPService через .lastResult как-то обновляет себя в dataProvider={svr.lastResult}. Как это можно реализовать? Цель заключается в следующем: создать объект, который взаимодействует с серверными xml, реализует в себе методы open,post, и который можно использовать повторно, а не создавать каждый раз отдельно HTTPService, request, xml, прописывать логику и т.д. Фактически необходим объект, в который параметром приходило бы название xml-ки, допустим, а на выходе получали провайдер, который можно использовать в качестве dataProvider грида или других элементов. При этом все изменения произведенные над ним можно запостить, непосредственно обратившись к объекту.

Прошу простить, если выразил мысль невнятно. Может я не знаю основ flex, но дни поиска в интернете пока ничего не дали.

Foli 13.02.2009 22:38

Цитата:

Сообщение от Terricks (Сообщение 798044)
Теперь же мне нужно измененные в гриде данные отправить обратно на сервер.

1)
На сервере беру данные из таблицы, заварачиваю их в XML и добовляю к каждой строке XML элемент <select>false</select>
Например:
Код:

<table_user>
        <item>
              <id>1</id>
              <select>false</select>
              <name>Mike</name>
              <phon>03</phon>
          </item>
          <item>
              <id>2</id>
              <select>false</select>
              <name>Dude</name>
              <phon>03</phon>
          </item>
</table_user>

2)
отдаю всё это клиенту.

3)
У клиента отображаю всё в DataGrid

4)
Вешаю событие на редактирование.
Как только что-то изменится в гриде, меняю в XML'ле поле:
<select>true<select>

5)
Посылаю на сервер всё, что <select>true<select> и сохраняю в БД.

ЗЫ: Если в гриде есть CheckBox'сы, то можно без поля <select>true<select>
Просто будешь смотреть выделенные items и их посылать на сервер.

ЗЫ2: Можно не париться с XML'ем, а просто использовать RemoteObject. Мой любимый вариант.

Terricks 14.02.2009 12:12

Цитата:

Сообщение от Foli (Сообщение 798140)
5)
Посылаю на сервер всё, что <select>true<select> и сохраняю в БД.

А как послать данные (т.е. именно как и во что их обернуть, чтобы в <request> HTTPService'а послать эти данные? И как именно реализован прием во flex xml? Т.е. создается отдельно переменная XML, XMLList, которые потом заполняются, как производится запрос? Через HTTPService?

Как реализовать закомментированные вопросы ниже по коду?
Код:

    <mx:HTTPService id="srv" url="test.xml" method="GET" result = "testXML = XML(srv.lastResult.rootnode.node)">
            <mx:request xmlns="">
                    {testXML} <!-- Здесь должен отправляться XML переменной testXML. Как? -->
            </mx:request>
    </mx:HTTPService>

  <!-- Ниже после запроса testXML данные должны появляться в гриде. Но их нету, хотя в переменную testXML они заносятся -->
  <!-- Если написать вместо {testXML} {srv.lastResult.rootnode.node}, то все будет ок. -->
  <mx: DataGrid id="grid" dataProvider="{testXML}" width="100%" height="100%" editable="true">
        <mx:columns>
            <mx: DataGridColumn dataField="Enterprise_ID" headerText="Product Id" editable="false"/>
            <mx: DataGridColumn dataField="Name" headerText="Name" editable="true"/>
            <mx: DataGridColumn dataField="Full_Name" headerText="Price" textAlign="right" editable="true"/>
            <mx: DataGridColumn dataField="Type_ID" headerText="Qty" textAlign="right" editable="true"/>
        </mx:columns>
    </mx: DataGrid>


Foli 14.02.2009 14:19

Цитата:

Сообщение от Terricks
чтобы dataProvider = ссылался не на srv.***, а на, скажем, функцию типа гет, которая возвращает svr.lastResult.root.node. Т.е. dataProvider = '{varXML}',
Так вообще можно сделать?

Ты как-то не правильно делаешь. Не красиво и сбивает с логики.
Смотри,
1)
Тебе надо создать HTTPService и повесить событие для получения результата. Вешаем:

Код:

<mx:HTTPService
        id="httpServ"
        url="http://localhost:8080/servlet/myservlet"
        resultFormat="e4x"
        result="resultHandler(event)"/>

2)
При получении ответа от сервера в resultHandler(event) обрабатываешь его.
Обрабатываем:
Код:

[Bindable]
public var myXML:XML;

private function resultHandler(event:ResultEvent):void
{
        //получили XML
        myXML = event.result as XML;
       
        //теперь скормим его нашему DataGrid'у
        this.myDataGrid.dataProvider = myXML.имя элемента в myXML
}

----------------------------------------------------------------------------------------------------

Теперь, что касается посылки данных.
Я не знаю, кто у тебя на сервере всё это дело обрабатывает. Ты плохо описал серверную часть. Но у меня всё в Java.

2)
Создаёшь объект, в который нужно положить свои данные для отправки. Создаём:
Код:

public function sendYourData():void
{
        //[1]
        var obj:Object = {};
        obj["id"] = “11”;
        obj["name"] = “junior”;
        obj["phone"] = “03”;
        obj["note"] = “I'm not over!”;

        //[2] послали на сервер.
        httpServ.send(obj);

3)
На сервере сервлет обработает полученные данные.

:umnik2:

Terricks 14.02.2009 21:05

Foli, большое спасибо, буду разбираться!
P.S. Серверная часть выполнена в Delphi, используя компонент Indy idHTTPServer, т.к. уже существует сервер приложений, который организует доступ к данным, и он, в свою очередь, должен предоставлять их через веб.
P.P.S. Еще раз огромное спасибо!


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

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