powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как передать массив JS в ZEN-метод?
29 сообщений из 29, показаны все 2 страниц
Как передать массив JS в ZEN-метод?
    #36446734
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В js-методе формирую массив, состоящие из до 10 элементов, целочисленного типа, они же будут id объектов хранимиого класса, дальше нужно передать этот массив в ZEN-метод и получить доступ к экземплярам, id которых хранится в массиве... как это поумнее сделать не могу сообразить?
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36446764
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CacheLot,

Все, что можно гонять между JS и ZEN, лежит в %ZEN.Datatype.*
Соотв., как-то так, думаю:

datatype class %ZEN.Datatype.list extends datatype

This is a specialized datatype.
On the server this represents a set of items as a piece-delimited string.
On the client this is converted to a JavaScript array.
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36446780
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolesovCacheLot,


datatype class %ZEN.Datatype.list extends datatype

мдя, не много методов у этого класса, думаю мож тогда строку формировать, и на сервере разбирать и вытаскивать id ? по старинке(:
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36446799
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неа, не хочет у меня так работать - говорит, тока литеральные вэльи можно...
тогда остается так:

Код: plaintext
var tmp = zenPage.zenMethod(array.join(","));
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36447362
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CacheLot,

вот значит как:
1. на странице определить новове свойство:
Код: plaintext
Property rowArrayInfo As %ZEN.Datatype.list(XMLPROJECTION = "none", ZENSETTING =  0 );
2. правило 1 (обращение из COS)
массив формируется в виде строки с разделителем $c(5)
3. правило 2 (обращение из JS)
как к обычному массиву, объявленному в JS
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36447398
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ymka2007 , т.е. так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/// JS
ClassMethod AddRecipe() As %String [ Language = javascript ]
{
	var arr={ 1 , 2 , 3 , 4 ,"test"}
	var tmp = zenPage.zenMethod(arr);
}

///  COS
ClassMethod zenMethod(Arr as %String) As %String [ ZenMethod ]
{
	dlm=$c( 5 )
	for i= 1 : 1 :$l(Arr,dlm) {
		s ^tmp(i)=$p(Arr,dlm,i)
	}
	q ""
}
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36447605
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Class WEB.Component.gbDynaGrid Extends %ZEN.Component.dynaGrid
{
Parameter NAMESPACE = "http://www.intersystems.com/zendemo";
Property rowArrayInfo As %ZEN.Datatype.list(XMLPROJECTION = "none", ZENSETTING =  0 ); 
...

/// возвращает массив из элементов строки или восстанавливает строку
Method getRowArrayInfo(row, par) [ Language = javascript ]
{
   ///обнуление массива
   this.rowArrayInfo=new Array();
   ///
	par=(null==par)?false:par;
	for (var c= 0 ;c<=this.getColumnCount();c++) {
		if (!par) this.rowArrayInfo[c]=this.getCellValue(row,c);
		else if (par) this.setCellValue(this.rowArrayInfo[c],row,c);
	}
	if (!par) return this.rowArrayInfo;
}
///  COS
Method zenMethod(id) As %Status [ ZenMethod ]
{
   s %page.rowArrayInfo="a1"_$c( 5 )_"b1"_$c( 5 )
  
   q $$$OK
}
}
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36447615
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все обращения через объект страницы
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36448459
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ymka2007,

Код: plaintext
1.
2.
3.
4.
5.
6.
///  COS
Method zenMethod(id) As %Status [ ZenMethod ]
{
   s %page.rowArrayInfo="a1"_$c( 5 )_"b1"_$c( 5 )
  
   q $$$OK
}

Даст ощутимые затраты трафика в обе стороны.
Лучше уж тогда парсить строку с разделителями.
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36448879
YuraM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день CacheLot!

Можно попробовать таким образом:

Method saveItem() [ Language = javascript ]
{
var menu= zenPage.getComponentById('SelectMenu');
var itemCount=menu.getOptionCount();
var getStringItem = new Array();
for (i=0;i<itemCount;i++)
{
getStringItem[i]=menu.getOptionValue(i)+'^'+menu.getOptionText(i);
}
this.savePermissionGroup(getStringItem);
}

Method savePermissionGroup(listItem As %ListOfDataTypes) [ ZenMethod ]
{
s cl=##class(DATA.SHARED.GroupUserSys).%OpenId(..objID)
s name=cl.Name
d cl.SelectMenu.Clear()
s res=""
if (listItem'="")
{
for i=1:1:listItem.Count()
{
s clItem=##class(DATA.SHARED.ParamSaveGroup).%New()
s clItem.value=$p(listItem.GetAt(i),"^",1)
s clItem.text=$p(listItem.GetAt(i),"^",2)
d cl.SelectMenu.Insert(clItem)
s res=res_clItem.value_":U,"
}

}
...
}
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36448948
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolesov,

смотря что делать и в какой момент
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36451505
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuraM,

Благодарю, кое-что получилось. Теперь нужно как то протащить через js-метод объектную ссылку? Это можно организовать?
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36451517
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CacheLotТеперь нужно как то протащить через js-метод объектную ссылку? Это можно организовать?
Как вариант просто передать ИД, а сам объект уже открыть в методе...
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36451643
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaCacheLotТеперь нужно как то протащить через js-метод объектную ссылку? Это можно организовать?
Как вариант просто передать ИД, а сам объект уже открыть в методе...

А если объект новый? Т.е. Id ещё не известен?
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36451721
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CacheLot , так ореф имеет привязку к самому процессу/джобу... Даже если ты его туда и передашь... Что это даст?
Ведь браузер с JS живут соей жизнью, а кащейские методы своей... Да и откуда JS возьмёт ореф экземпляра?
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36451879
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

Это понятно, я подумал может можно как предложил Yumka - создать свойство для хранения объектной ссылки, в определённый момоент зполнить его значением и в нужный момент считать с дальнейшим обнулением... как то так..
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36452226
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CacheLot , если ты покинул кащейский метод - ореф утерян. Все изменения не записанные - утеряны. Т.ч. нет смысла даже хранить этот ореф... Тем паче его передавать через посредника (JS) другому методу...
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36452257
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

+1
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36452781
YuraM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, CacheLot!
Может быть подойдет %ZEN.proxyObject? (все зависит от конкретной задачи)

Из клиента на сервер

Фрагмент кода "клиента"
...
var obj = new zenProxy();
obj.name = 'Smith';
obj.code = 'CRM114';
var ok = this.MyMethod(obj);
...

Фрагмент кода "сервера"
ClassMethod MyMethod(pProxy as %ZEN.proxyObject) As %Boolean [ZenMethod]
{
Set tName = pProxy.name
Set tCode = pProxy.code
Quit 1
}

Из сервера на клиент

Фрагмент кода "сервера"
ClassMethod GetServerInfo() As %ZEN.proxyObject [ZenMethod]
{
Set tProxy = ##class(%ZEN.proxyObject).%New()
Set tProxy.whatever = "Some server value"
Quit tProxy
}

Фрагмент кода "клиента"
...
var obj = this.getServerInfo();
alert(obj.whatever);
...
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36453348
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал тестовый пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
//В описании свойств:
Property rowArrayInfo As %ZEN.Datatype.list(XMLPROJECTION = "none", ZENSETTING =  0 ); 


//Формирование js-массива

Method Test() [ Language = javascript ]
{
	//Задаём новый массив
	this.rowArrayInfo = new Array();
	for (var i =  0 ; i <=  5 ; i++)
	this.rowArrayInfo[i]=i;
	alert(this.rowArrayInfo.length);
	return;
}

Method tTest() [ ZenMethod ]
{
	&js<zenPage.Test();
	    alert('#(%page.rowArrayInfo)#');
	    >
   q 
   
}


При этом в ZEN-методе alert('#(%page.rowArrayInfo)#'); - срабатывает со второго раза?
Т.е. при обращении к tTest() - получаем 2 сообщения: количество элементов массива и пустую строку, и уже со второго раза - получаем то что нужно...
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36455239
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CacheLot,

у тебя так и написано:
1. вызвать метод Test(), в котором выводится первое сообщение (кол-во элементов)
2. вызвать alert(#(...)#), в котором выводится объект rowArrayInfo
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36455424
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ymka2007CacheLot,

у тебя так и написано:
1. вызвать метод Test(), в котором выводится первое сообщение (кол-во элементов)
2. вызвать alert(#(...)#), в котором выводится объект rowArrayInfo

только почему то объект rowArrayInfo - не обновляется сразу?? После вызова &js<zenPage.Test();> Как его обновить? Нужно сразу после формирования js-массива (т.е. после завершения js-метода) работать с ним на COS... Как это свойство rowArrayInfo обновить для использования в ZEN-методе?
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36455722
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
//В описании свойств:
Property rowArrayInfo As %ZEN.Datatype.list(XMLPROJECTION = "none", ZENSETTING =  0 ); 


//Формирование js-массива

Method Test() [ Language = javascript ]
{
	//Задаём новый массив
	this.rowArrayInfo = new Array();
	for (var i =  0 ; i <=  5 ; i++)
	this.rowArrayInfo[i]=i;
	alert(this.rowArrayInfo.length);
	return true;
}

Method tTest() [ ZenMethod ]
{
	&js<zenPage.Test();>
             s ^A=$p(..rowArrayInfo,$c( 5 ), 2 );
   q    
}
или так
Method t1Test() [ Language = javascript ]
{
	var sc=this.Test();
             if (!sc) {alert('error'); return;}
             this.t2Test();
   q    
}
Method t2Test() [ ZenMethod ]
{
   s ^A=$p(..rowArrayInfo,$c( 5 ), 2 );
   q    
}

напишите какой из вариантов запустился.
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36456276
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ymka2007,

Первый вариант упорно не желает отрабатывать, второй - без проблем!
В моей задаче нужно было запустить именно первый вариант (без передачи объектной ссылки - задача не решалась), но я пошёл уже другим путём, массив буду формировать в серверным стиле, нашёл способ как обойтись без ява-скрипта...
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36456951
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CacheLot,

тут скорее всего такая фишка,
что когда выполняется серверный метод, то перед началом выполнения он получает всю страницу целиком и опрерирует уже тем что получил, а в твоем случае он еще и выполняет какие то изменения на клиенте
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36457052
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CacheLotПервый вариант упорно не желает отрабатывать

Еще-бы ;) Это-ж http (выстрелил - забыл). Соответственно, %page - это НЕ СТРАНИЦА У КЛИЕНТА. Это некое представление страницы (слепок на момент вызова серверного метода), переданное НА СЕРВЕР.

И
Код: plaintext
1.
2.
3.
4.
	&js<
zenPage.Test(); // Выполняется на компьютере клиента в его версии страницы
alert('#(%page.rowArrayInfo)#'); // Выполняется на сервере с неким слепком страницы,
//созданным на момент вызова метода
>

Кроме того, после выполнения серверного метода слепок со страницы будет передан обратно и результаты первой строчки уничтожит.

Но вот вопрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Property rowArrayInfo As %ZEN.Datatype.string; 

XData editPane [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<pane xmlns="http://www.intersystems.com/zen" id="editPane" >
<button caption=" test " onclick="zenPage.Test();" />
<text size="100" id="testText" />
</pane>
}


Method Test1() [ Language = javascript ]
{
	zenPage.getComponentById('testText').setProperty('value',zenPage.getComponentById('testText').getProperty('value')+' c1 '+zenPage.rowArrayInfo)
	//zenPage.rowArrayInfo=zenPage.rowArrayInfo+'c';
	//zenPage.rowArrayInfo="111"; // НЕ РАБОТАЕТ
	zenPage.rowArrayInfo= 111 ; // РАБОТАЕТ
	zenPage.getComponentById('testText').setProperty('value',zenPage.getComponentById('testText').getProperty('value')+' c2 '+zenPage.rowArrayInfo)
	return  1 ;
}

Method Test() As %Status [ ZenMethod ]
{
	&js<
		zenPage.getComponentById('testText').setProperty('value','')
		zenPage.getComponentById('testText').setProperty('value',zenPage.getComponentById('testText').getProperty('value')+' s1 '+zenPage.rowArrayInfo)
		var tmp = zenPage.Test1();
		zenPage.getComponentById('testText').setProperty('value',zenPage.getComponentById('testText').getProperty('value')+' s2 '+zenPage.rowArrayInfo)
	    >
	//s %page.rowArrayInfo = %page.rowArrayInfo_"s"
	//s %page.rowArrayInfo = "222" // НЕ РАБОТАЕТ
	s %page.rowArrayInfo =  222  // РАБОТАЕТ
	q $$$OK
}

Почему при использовании числа (111 и 222)
результат, начиная со второго шага стабильный:
s1 c1 c2 111 s2 111
s1 222 c1 222 c2 111 s2 111
s1 222 c1 222 c2 111 s2 111
s1 222 c1 222 c2 111 s2 111
...
а при использовании строки ("111" и "222")
вот такая ерунда:
s1 c1 c2 111 s2 111
s1 222 c1 222 c2 111 s2 111
s1 111 c1 111 c2 111 s2 111
s1 222 c1 222 c2 111 s2 111
s1 111 c1 111 c2 111 s2 111
... ??? О_о
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36458024
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуйте так:
Код: plaintext
Property rowArrayInfo As %ZEN.Datatype.list(XMLPROJECTION = "none", ZENSETTING =  0 );
вместо
Код: plaintext
Property rowArrayInfo As %ZEN.Datatype.string;
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36458679
Фотография kolesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ymka2007попробуйте так:

С того и начал... взял Ваш код повыше...
А что, кстати, эти модификаторы дают? XMLPROJECTION не должно роли играть... а вот ZENSETTING ведет себя несколько не по документации - при значении 0 все равно позволяет заполнять свойство через %page, а вроде не должно...
...
Рейтинг: 0 / 0
Как передать массив JS в ZEN-метод?
    #36460457
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolesov,
это доку читать нужно, я не в курсе
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как передать массив JS в ZEN-метод?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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