Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как передать массив JS в ZEN-метод? / 25 сообщений из 29, страница 1 из 2
03.02.2010, 12:29
    #36446734
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
В js-методе формирую массив, состоящие из до 10 элементов, целочисленного типа, они же будут id объектов хранимиого класса, дальше нужно передать этот массив в ZEN-метод и получить доступ к экземплярам, id которых хранится в массиве... как это поумнее сделать не могу сообразить?
...
Рейтинг: 0 / 0
03.02.2010, 12:35
    #36446764
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
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
03.02.2010, 12:41
    #36446780
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
kolesovCacheLot,


datatype class %ZEN.Datatype.list extends datatype

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

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

вот значит как:
1. на странице определить новове свойство:
Код: plaintext
Property rowArrayInfo As %ZEN.Datatype.list(XMLPROJECTION = "none", ZENSETTING =  0 );
2. правило 1 (обращение из COS)
массив формируется в виде строки с разделителем $c(5)
3. правило 2 (обращение из JS)
как к обычному массиву, объявленному в JS
...
Рейтинг: 0 / 0
03.02.2010, 15:31
    #36447398
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
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
03.02.2010, 16:46
    #36447605
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
Код: 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
03.02.2010, 16:49
    #36447615
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
все обращения через объект страницы
...
Рейтинг: 0 / 0
04.02.2010, 03:03
    #36448459
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
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
04.02.2010, 10:59
    #36448879
YuraM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
Добрый день 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
04.02.2010, 11:18
    #36448948
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
kolesov,

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

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

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

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

+1
...
Рейтинг: 0 / 0
05.02.2010, 18:51
    #36452781
YuraM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
Доброго времени суток, 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
06.02.2010, 13:21
    #36453348
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
Сделал тестовый пример:
Код: 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
08.02.2010, 13:03
    #36455239
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
CacheLot,

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

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

только почему то объект rowArrayInfo - не обновляется сразу?? После вызова &js<zenPage.Test();> Как его обновить? Нужно сразу после формирования js-массива (т.е. после завершения js-метода) работать с ним на COS... Как это свойство rowArrayInfo обновить для использования в ZEN-методе?
...
Рейтинг: 0 / 0
08.02.2010, 15:55
    #36455722
Ymka2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
Код: 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
08.02.2010, 19:51
    #36456276
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как передать массив JS в ZEN-метод?
Ymka2007,

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

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


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