Фундаментальный принцип управления данными во Flex - PullRequest
4 голосов
/ 30 июля 2011

Я не уверен, что мой заголовок действительно отражает то, что здесь происходит ... Я просто понял, что, очевидно, мне не хватает фундаментального принципа в том, как Flex обрабатывает данные (память?), И мне нужна некоторая помощь, чтобы понять это.

У меня есть таблица MySQL с именем friends, которая содержит следующие строки:

MySQL table friends
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Mark      | Smith    |
| Andrew    | Barnes   |
+-----------+----------+

В следующем примере я три раза вызываю свой friendsService.getAllFriends (), а затем присваиваю результат DataProvider трех разных DataGrids.

Во второй раз, когда я отправляю запрос в базу данных, я меняю имя Марка на Питер, только перед тем, как присваивать результат DataProvider. Я не обновляю базу данных каким-либо образом, верно? : -)

Что я ожидаю:

MyDataGrid1
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Mark      | Smith    |
| Andrew    | Barnes   |
+-----------+----------+

MyDataGrid2
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Peter     | Smith    | <---- Say hello to Peter :-)
| Andrew    | Barnes   |
+-----------+----------+

MyDataGrid3
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Mark      | Smith    |
| Andrew    | Barnes   |
+-----------+----------+

После вызова второго запроса (тот, где я переключаю Марка на Питера программно), похоже, что все три результата связаны каким-то образом, я не понимаю ... Я получаю:

MyDataGrid1
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Peter     | Smith    |
| Andrew    | Barnes   |
+-----------+----------+

MyDataGrid2
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Peter     | Smith    |
| Andrew    | Barnes   |
+-----------+----------+

MyDataGrid3
+-----------+----------+
| firstname | lastname |
+-----------+----------+
| Peter     | Smith    |
| Andrew    | Barnes   |
+-----------+----------+

Похоже, Flex на самом деле не запрашивает новые данные, предполагая, что он уже получил ответ от friendsService.getAllFriends () ...

Есть ли у меня какое-то просветление? : -)

СПАСИБО!

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:friendsservice="services.friendsservice.*"
    creationComplete="creationCompleteHandler(event)">

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            import mx.events.FlexEvent;
            import mx.rpc.events.ResultEvent;

            private var _step:Number = 1;

            protected function creationCompleteHandler(event:FlexEvent):void
            {
                getAllFriends();
            }

            protected function getAllFriends():void
            {
                getAllFriendsResult.token = friendsService.getAllFriends();
            }

            protected function getAllFriendsResult_resultHandler(event:ResultEvent):void
            {

                if (_step == 1) {
                    assignValuesToDataGrid(MyDataGrid1, event.result, _step);
                    dbg.text = "MyDataGrid1 has been loaded";
                }

                if (_step == 2) {
                    assignValuesToDataGrid(MyDataGrid2, event.result, _step);
                    dbg.text = "MyDataGrid2 has been loaded";
                }

                if (_step == 3) {
                    assignValuesToDataGrid(MyDataGrid3, event.result, _step);
                    dbg.text = "MyDataGrid3 has been loaded";
                }

                _step++;
            }

            protected function assignValuesToDataGrid(dg:DataGrid, result:Object, step:Number):void
            {
                if (step == 2)
                    result[0].firstname = "Peter";

                dg.dataProvider = result;
            }

        ]]>
    </fx:Script>

    <fx:Declarations>
        <s:CallResponder id="getAllFriendsResult" result="getAllFriendsResult_resultHandler(event)"/>
        <friendsservice:FriendsService id="friendsService"/>
    </fx:Declarations>

    <s:layout>
        <s:VerticalLayout/>
    </s:layout>

    <s:Button label="Load next DataGrid" click="getAllFriends()"/>

    <mx:DataGrid id="MyDataGrid1" width="100%" height="100">
        <mx:columns>
            <mx:DataGridColumn headerText="First name" dataField="firstname"/>
            <mx:DataGridColumn headerText="Last name" dataField="lastname"/>
        </mx:columns>
    </mx:DataGrid>

    <mx:DataGrid id="MyDataGrid2" width="100%" height="100">
        <mx:columns>
            <mx:DataGridColumn headerText="First name" dataField="firstname"/>
            <mx:DataGridColumn headerText="Last name" dataField="lastname"/>
        </mx:columns>
    </mx:DataGrid>

    <mx:DataGrid id="MyDataGrid3" width="100%" height="100">
        <mx:columns>
            <mx:DataGridColumn headerText="First name" dataField="firstname"/>
            <mx:DataGridColumn headerText="Last name" dataField="lastname"/>
        </mx:columns>
    </mx:DataGrid>

    <s:Label id="dbg" fontWeight="bold"/>

</s:WindowedApplication>

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

FriendService использует AbstractEntityMetadata для управления объектами.Итак, я думаю, что это объединение друзей на основе их идентификаторов.

Я имею в виду, скажем, у Марка есть идентификатор 1, так как это управляемый объект, когда вы делаете новый вызов на сервер вместо созданияновые объекты, он сначала ищет экземпляры с идентификатором 1 и обновляет его.Вот почему все три блока данных имеют одинаковые объекты.

1 голос
/ 02 августа 2011

После нескольких тестов, я думаю, я понял, что происходит.

При создании службы с помощью инструмента «Подключиться к данным / службе» при использовании параметра «Создать образец» Flash Builder автоматически включает параметр «Управление данными»..

Давайте посмотрим на файл / src / services / friendservice / _Super_FriendService.as , где-то у нас это есть:

var dmOperation : mx.data.ManagedOperation;
var dmQuery : mx.data.ManagedQuery;

dmQuery = new mx.data.ManagedQuery("getAllFriends");
dmQuery.propertySpecifier = "id,firstname,lastname";
dmQuery.parameters = "";
_friendsRPCDataManager.addManagedOperation(dmQuery);

dmOperation = new mx.data.ManagedOperation("deleteFriends", "delete");
dmOperation.parameters = "id";
_friendsRPCDataManager.addManagedOperation(dmOperation);     

dmOperation = new mx.data.ManagedOperation("getFriendsByID", "get");
dmOperation.parameters = "id";
_friendsRPCDataManager.addManagedOperation(dmOperation);     

dmOperation = new mx.data.ManagedOperation("updateFriends", "update");
dmOperation.parameters = "item";
_friendsRPCDataManager.addManagedOperation(dmOperation);     

dmOperation = new mx.data.ManagedOperation("createFriends", "create");
dmOperation.parameters = "item";
_friendsRPCDataManager.addManagedOperation(dmOperation);

Теперь,давайте заменим ValueObject, сгенерированный инструментом Connect to Data / Service, на пользовательский объект.

Выбрав параметр Автоопределение типа возврата по образцу данных , Flash Builder будетзапрос к базе данных, сбор типов полей и соответствующая настройка объекта значения.Теперь давайте снова посмотрим на наш _Super_FriendService.as:

var dmOperation : mx.data.ManagedOperation;
var dmQuery : mx.data.ManagedQuery;

dmOperation = new mx.data.ManagedOperation("deleteFriends", "delete");
dmOperation.parameters = "id";
_friendsRPCDataManager.addManagedOperation(dmOperation);     

dmOperation = new mx.data.ManagedOperation("getFriendsByID", "get");
dmOperation.parameters = "id";
_friendsRPCDataManager.addManagedOperation(dmOperation);     

dmOperation = new mx.data.ManagedOperation("updateFriends", "update");
dmOperation.parameters = "item";
_friendsRPCDataManager.addManagedOperation(dmOperation);     

dmOperation = new mx.data.ManagedOperation("createFriends", "create");
dmOperation.parameters = "item";
_friendsRPCDataManager.addManagedOperation(dmOperation);

Сюрприз, блока dmQuery = new mx.data.ManagedQuery("getAllFriends"); больше нет ... И мы знаем, что мы можем отключить Управление данными для следующих операций ( Создание (добавление) элемента, получение элемента, обновление элемента и удаление элемента ).

Таким образом, используя пользовательский ValueObject, мы получаем точно такую ​​же информацию, как сгенерированный ValueObject, без блока с ошибкамимне уже 2 дня.Я просто счастлив, что нашел обходной путь, чтобы действительно и полностью отключить управление данными.

...