Я играл с Джаксер, и хотя концепция очень крутая, я не могу понять, как определять объекты, доступные как на клиенте, так и на сервере. Ни один из примеров, которые я не могу найти, вообще определяет объекты.
Я хотел бы иметь возможность определить объект и указать, какие методы будут доступны на сервере, какие будут доступны на клиенте, а какие будут доступны на клиенте, но будут выполняться на сервере (сервер-прокси). Можно ли это сделать без использования трех отдельных тегов <script
> с разными атрибутами runat
? Я хотел бы иметь возможность определять все мои методы в одном файле js, если это возможно, и нецелесообразно определять мои объекты, встроенные в html, с тремя отдельными тегами ...
В принципе, я бы хотел сделать это в одном файле js:
function Person(name) {
this.name = name || 'default';
}
Person.runat = 'both';
Person.clientStaticMethod = function () {
log('client static method');
}
Person.clientStaticMethod.runat = 'client';
Person.serverStaticMethod = function() {
log('server static method');
}
Person.serverStaticMethod.runat = 'server';
Person.proxyStaticMethod = function() {
log('proxy static method');
}
Person.proxyStaticMethod.runat = 'server-proxy';
Person.prototype.clientMethod = function() {
log('client method');
};
Person.prototype.clientMethod.runat = 'client';
Person.prototype.serverMethod = function() {
log('server method');
};
Person.prototype.serverMethod.runat = 'server';
Person.prototype.proxyMethod = function() {
log('proxy method');
}
Person.prototype.proxyMethod.runat = 'server-proxy';
Кроме того, если я смог это сделать, как мне правильно включить его в html-страницы?
Я нашел сообщение на форумах Aptana (которого больше нет в сети), в котором говорится, что проксировать можно только глобальные функции ... Облом.
Однако я поигрался, и вы можете контролировать, какие методы будут доступны на клиенте и сервере, поместив свой код во включаемый файл и используя теги <script>
с атрибутами runat
.
Например, я могу создать этот файл с именем Person.js.inc
:
<script runat = "both">
function Person(name) {
this.name = name || 'default';
}
</script>
<script runat = "server">
Person.prototype.serverMethod = function() {
return 'server method (' + this.name + ')';
};
Person.serverStaticMethod = function(person) {
return 'server static method (' + person.name + ')';
}
// This is a proxied function. It will be available on the server and
// a proxy function will be set up on the client. Note that it must be
// declared globally.
function SavePerson(person) {
return 'proxied method (' + person.name + ')';
}
SavePerson.proxy = true;
</script>
<script runat = "client">
Person.prototype.clientMethod = function() {
return 'client method (' + this.name + ')';
};
Person.clientStaticMethod = function (person) {
return 'client static method (' + person.name + ')';
}
</script>
И я могу включить его на страницу, используя:
<jaxer:include src = "People.js.inc"></jaxer:include>
К сожалению, с этим методом я теряю преимущество кеширования браузера для клиентских скриптов, потому что все скрипты встроены. Единственный способ, который я могу найти, чтобы избежать этой проблемы, - это разделить клиентские методы, серверные методы и общие методы на их собственные js-файлы:
<script src = "Person.shared.js" runat = "both" autoload = "true"></script>
<script src = "Person.server.js" runat = "server" autoload = "true"></script>
<script src = "Person.client.js" runat = "client"></script>
И в этот момент я мог бы также разделить прокси-функции в их собственный файл ...
<script src = "Person.proxies.js" runat = "server-proxy"></script>
Обратите внимание, что я использовал autoload = "true"
для общих и серверных сценариев, чтобы они были доступны для прокси-функций.