powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Передача массива (объекта) из ZenPage в Модель данных
18 сообщений из 18, страница 1 из 1
Передача массива (объекта) из ZenPage в Модель данных
    #35361860
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С Cache только начал разбираться. Уткнулся в следующее:
Есть некий Persistent класс. Под него есть модель данных.
Также для редактирования объектов класса есть Zen-страничка, работающая с этой моделью.
На самой странице, помимо всего прочего, формируется ListOfDataTypes. Вот этот list очень хочется передать в модель для дальнейшей обработки. Когда я отправляю его (по сабмиту) в модель в лоб (просто присваивая его одному из свойств модели), то в самой модели я получаю лишь строку следующего вида "52@%Library.ListOfDataTypes". Теперь либо из этой строки как-то нужно достать сам объект, либо нужно модель и страницу научить передавать объекты.
Как быть?
Заранее спасибо.
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35361904
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например в CSP можно просто передать ID экземпляра, а дальше орудовать с этим как душе угодно...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35361937
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я говорю про list. Какой у них Id? Для объектов Persistent ситуация более-менее ясна. Передал Id со страницы, а потом по OpenId делай что хочешь с объектом.
Тут тогда уж через Oref действовать нужно. Но как?
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363416
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется что-то типа такого можно сделать:

перевести объект в список - %SerializeObject (метод класса %Library.RegisteredObject)
передать полученную переменную (список) куда нужно,
а там создать заново методом %New(ПеременнаяКудаСохраняем)

PS. мопед не мой
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363651
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.Кажется что-то типа такого можно сделать:

перевести объект в список - %SerializeObject (метод класса %Library.RegisteredObject)
передать полученную переменную (список) куда нужно,
а там создать заново методом %New(ПеременнаяКудаСохраняем)

PS. мопед не мой

Можно подробнее?
Пытаюсь делать по совету так:
на Zen-странице при сохранении пытаюсь запихнуть List в переменную ParamItems

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
set P1 = %page.%GetComponentById("ParamItems")
	set P1.value = // тут формируется List
	do P1.value.%SerializeObject()
	&js<		
    	var form = zenPage.getComponentById("form");
		form.sendEventToController('propertyChange', 'ParamItems', '#(P1.value)#');
	>

В модели пытаюсь вытащить эту переменную:
Код: plaintext
1.
2.
set a = ##class(%ListOfDataTypes).%New(..ParamItems)
w a.Count() // возвращает  0 
Что я делаю не так?
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363699
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор method %SerializeObject(ByRef serial As %Binary, partial As %Integer = 0) returns %Status

То есть ему нужно в параметры подсунуть переменную, куда его сериализуете
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363762
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок. Делаю так:
На Zen-Странице
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
set SerialElement = %page.%GetComponentById('ParamItems')
set m = ##class(%ListOfDataTypes).%New()
set SerialElement.value = ..GetCurrentValues()	
do SerialElement.value.%SerializeObject(.m)
set SerialElement.value = m
&js<		
   	var form = zenPage.getComponentById("form");
	form.sendEventToController('propertyChange', 'ParamItems', '#(SerialElement.value)#');
>
set ^z = SerialElement.value

При этом глобал имеет такой вид
^z2 = $lb($lb("54@%Library.ArrayOfDataTypes"),"%ListOfDataTypes")

Попытка получить List из переменной ParamItems в модели не успешна.

Что я делаю не так?
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363791
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлено:
Явовская строка
form.sendEventToController('propertyChange', 'ParamItems', '#(SerialElement.value)#');
уже вызывает ошибку....
Возможно тут как-то нужно экранировать....
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363833
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sutniКогда я отправляю его (по сабмиту) в модель в лоб (просто присваивая его одному из свойств модели), то в самой модели я получаю лишь строку следующего вида "52@%Library.ListOfDataTypes".
А что получим в модели, если вывести не [переменная модели], а [переменная модели].Count(), например,
Код: plaintext
w ..ParamItems.Count()
?
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363853
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сериализация прошла успешно, это видно по глобалу.

А что такое
Код: plaintext
set SerialElement.value = m
Это корректно? Это ведь наверно поле определенного типа, оно нормально принимает значение $list?

Далее
Код: plaintext
form.sendEventToController('propertyChange', 'ParamItems', '#(SerialElement.value)#');
Вы этот список пытаетесь передать как строку, обрамляя кавычками. Это тоже очень врядли будет работать. Сорее всего нужно дополнительное кодирование списка в строку. (К сожалению, тут на ум не приходит в ходу ничего), а затем обратное раскодирование и создание объекта в нужном месте.
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363874
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для конветрации списка в строку $LISTTOSTRING не подходит, так как есть сложенные списки, я бы стал использовать

Код: plaintext
s str=$ZCVT(list,"O","URL")
ну и обратно
Код: plaintext
s list=$ZCVT(str,"I","URL")
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363884
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit sutniКогда я отправляю его (по сабмиту) в модель в лоб (просто присваивая его одному из свойств модели), то в самой модели я получаю лишь строку следующего вида "52@%Library.ListOfDataTypes".
А что получим в модели, если вывести не [переменная модели], а [переменная модели].Count(), например,
Код: plaintext
w ..ParamItems.Count()
?

Получим сообщение Invalid OREF. ..ParamItems - Строка, для которой не Count().
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363920
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну хорошо.
Придёт мне в модель строка вида:
$lb($lb("54@%Library.ArrayOfDataTypes"),"%ListOfDataTypes")

Как мне из нее получить снова список?
Вот что я пытаюсь делать в терминале:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
USER>set m = ##class(%ListOfDataTypes).%New()
USER>do m.Insert("a")
USER>do m.Insert("b")
USER>do m.Insert("c")
USER>w m
 1 @%Library.ListOfDataTypes

USER>set mm = ##class(%ListOfDataTypes).%New()
USER>do m.%SerializeObject(.mm)
USER>w mm
abc%ListOfDataTypes

USER>set mmm = ##class(%ListOfDataTypes).%New(mm)
USER>w mmm
 2 @%Library.ListOfDataTypes
USER>w mmm.Count()
 0 
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35363972
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так то лучше. А Зен всякий еще мешается :-)
Кстати объект здесь создается через %Open, как ни странно, а не %New, как я предполагал в начале

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
k
set m = ##class(%ListOfDataTypes).%New()
do m.Insert("a")
do m.Insert("b")
do m.Insert("c")
w m.Count()
d m.%SerializeObject(.list)
;тут мы список кодируем в строку
s str=$zcvt(list,"O","URL")
;тут что-то куда-то передаем
;а затем раскодируем обратно
s list2=$zcvt(str,"I","URL")
s mm=##class(%ListOfDataTypes).%Open(list2)
w mm.Count()
Вот как-то так. У меня работает, каше 5.2
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35364070
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Так всё работает!!!

Но лично для меня ситуация усложняется тем, что элементы моего List - это Array. А сериализация "вглубь" не работает. Поэтому буду пробовать сериализовать каждый array перед помещением его в list. Потом сериализовать List. Ну и на другой стороне всё в обратном порядке....
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35364239
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если внутри объекта свойства в виде ссылок на Persistent-объекты, то их должно сериализоваться
id@classname, а если свойства в виде SerialObject, то как список, вроде так.

Или не так?
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35364273
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще второй параметр есть у SerializeObject, я не понял, для чего он, может как-то связано?
...
Рейтинг: 0 / 0
Передача массива (объекта) из ZenPage в Модель данных
    #35364454
sutni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.Еще второй параметр есть у SerializeObject, я не понял, для чего он, может как-то связано?
Включение второго параметра в моём случае ни на что не повляло.

Блок А.Н.
Если внутри объекта свойства в виде ссылок на Persistent-объекты, то их должно сериализоваться
id@classname, а если свойства в виде SerialObject, то как список, вроде так.

Или не так?

В моём случае я получал просто строку "54@%Library.ArrayOfDataTypes". Просто Open для нее вызывл ошибку.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Передача массива (объекта) из ZenPage в Модель данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]