Как стать автором
Обновить

Комментарии 14

Я так и не понял, вы про Cache рассказывали или про jQuery? Подробнее про #call()#. Я не понял что будет вызываться на сервере то и как это работает? В сэмплах где делаются jQuery запросы там все понятно.

В целом ничего интересного. Даже глобально роутинг не настраивается?

Убило:
Наполните класс объектами
Дело в том что можно создать экземпляры класса. Но наполнить класс объектами нельзя. Абсолютно не верное употребление терминологии. Даже если говорить в рамках Cache. Пожалуйста исправьте.
Да, именно создание экземпляров класса имелось ввиду, возможно немного более «художественно», чем принято в терминологии. Поправлено.
В статье действительно присутствует легкий «ликбез» по jQuery, который возоможно интересен только апологетам Caché, вдруг не знакомым с этим фреймворком. Если тема интересна Хабрасообществу, возможна публикация следующей статьи, в которой будут показаны более интересные применения jQuery в Cache, уже совсем без вводной информации и в которой будут показаны эфффективные приемы, используемые в реальных приложениях.
За все сообщество говорить не буду, но было бы интересно.
#call — это асинхронный вызов методов класса на сервере Caché, которые в свою очередь могут изменять содержимое страницы без перерисовки ее целиком. После выполнения необходимых действий метод на сервере может вернуть код для выполнения в браузере, обычно JavaScript, для выполнения в браузере.

Фрагмент документации:
docs.intersystems.com/cache20121/csp/docbook/DocBook.UI.Page.cls?KEY=GCSP_tagbased#GCSP_C166935

Серверные методы можно вызывать как в базовой технологии Caché Server Pages, так и технологии ZEN, которая основана на CSP.
#call()# — синтаксис для асинхронного вызова методов сервера — аналог $.ajax()
#call( ..Add( arg ) )# — вызвать метод Add этого же класса (страницы) с передачей аргумента arg из javascript.
При получении такого вызова сервером создается динамическая страница, в которую выводится результат выполнения метода.

Что вы имели в виду под настройкой роутинга?
Погодите.

Вот функция JS:
function(){ #call(..GetNext($(".msg:last span:first").text()))# }
    , #($get(^chatSettings("timeout"),300))# 
   );	 //настройки тоже на сервере
}; //window.chat

В этой функции используется функция #call()#, которая, как я понимаю при рендеринге страницы должна вернуть некий код JS, в котором выполнится некий ajax запрос с параметрами. Верно? Или это как то по другому работает? И я не понял тогда, если есть возможность дернуть конкретный метод, используя функцию #call()#, то зачем использовать $.ajax(), передавая при этом дополнительный параметр, указывающий на то, какую функцию в итоге вызвать? Я запутался. :(

Хм. Вот щас еще раз почитал все и понял что вы начали использовать $.ajax(), из за того, что JS код находится в отдельном файле, и следовательно там функцию #call()# дернуть не получится. Верно? И отсюда сразу вопрос, как передавать с сервера параметры для JS, если JS код находится в другом файле? Ну вдруг понадобится…
Про передачу параметров ничего не говорите. Просто переработал я, видимо, с MS Ajax & asp.net.
#call имеет смысл использовать когда нужно вызвать методы описанные в том же классе где и описывается вызов
таким образом при компиляции класса данная конструкция преобразовывается в вызов JS функции из стандартной поставки Cache, куда передается ряд параметров, один из них хеш вызываемого метода который так же был сгенерирован при компиляции, скажем так данный подход использовался еще до jQuery, как предлагаемый способ реализации AJAX вызовов

т.е. описав например так
#call(..Test(Arg))

на выходе в уже готовом HTML будет нечто вроде этого
cspCallHttpServerMethod("EWBOUMfOcF44CH87oMHlleTmS7nyBZ1I3SP3yekGBZ7Rt2bLIrg6_jDSnfSiz6Br77r3ADUt2iA1SPY39ph8vJv9PW4IokLYzQnIpMXvGqs-&CSPCHD=000p0104000011cn55zy010000wxuFmWvB8m58PzqH2cxlJQ--",Arg)
"#call имеет смысл использовать когда нужно вызвать методы описанные в том же классе, где и описывается вызов"

Имеет смысл всегда, когда нужно асинхронно вызвать сервер, независимо от расположения серверного метода. Например:
 #call(anyPackage.otherClass.anyClassMethod(arg))#


«преобразовывается в вызов JS функции ..., куда передается ряд параметров, один из них хеш вызываемого метода»

В сгенерированной серверной программе будет примерно вот это:
Write "cspCallHttpServerMethod('"_(..Encrypt($listbuild("anyPackage.otherClass.anyClassMethod:csp.currentPage"))_$select(%session.UseSessionCookie'=2:"&CSPCHD="_%session.CSPSessionCookie,1:""))_",arg');",!


Т.е вызывается функция cspCallHttpServerMethod из фирменной библиотеки cspxmlhttp.js, в которую передается зашифрованный ключом сессии идентификатор серверного вызова в формате что вызывается: откуда вызывается
«начали использовать $.ajax(), из за того, что JS код находится в отдельном файле, и следовательно там функцию #call()# дернуть не получится. Верно?»
Нет, это была демонстрация того, как jquery может полностью заменить «фирменные» вызовы CSP.
#call()# можно вызывать из подключенных скриптов, предварительно упаковав в глобальную переменную на СSP-странице. Например, так:
  //эту часть скрипта располагаем на csp-странице
  window.serverMethods={
     add: function( msg ){
        #call(..Add(msg))#;
     }
  }

  //вызов из подключенного файла
  function test() {
     var msg="Hello world";
     window.serverMethods.add(msg)
  }


Какой смысл был писать «Предполагается, что читатель знаком бла-бла-бла», и после этого давать экспресс-курс по основному функционалу Jquery? Пользу Jquery каждый и так знает сам для себя, можно было начинать сразу с раздела «Cache + jQuery»
Судя по личному опыту, jQuery достаточно редко используется в web-приложениях на Cache, так как фирменные технологии реализуют схожий функционал «давным давно» — Cache c технологией CSP с 2001 года (jQuery с 2006), технология Zen (развитие CSP) с 2007. Поэтому «Jquery каждый и так знает сам для себя», в среде разработчиков Cache, имхо, не столь вероятно.
Мы в своем приложении последнее время стараемся чаще использовать именно jQuery, и в дальнейшем есть желание совсем отказаться от #call, в связи с тем что для него необходимо держать настроенным приложение /csp/, обработка ошибок при выполнении гиперевентов и нет возможности сделать свою точку входа, например для логгирования вызовов
Зарегистрируйтесь на Хабре, чтобы оставить комментарий