Определение объектов при использовании Jaxer - PullRequest
2 голосов
/ 21 сентября 2008

Я играл с Jaxer , и хотя концепция очень крутая, я не могу понять, как определить объекты, доступные как на клиенте, так и на сервере. Ни в одном из примеров я не могу найти определения объектов вообще.

Я бы хотел иметь возможность определить объект и указать, какие методы будут доступны на сервере, какие будут доступны на клиенте, а какие будут доступны на клиенте, но будут выполнены на сервере ( прокси-сервер). Можно ли это сделать без использования трех отдельных тегов <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-страницы?

1 Ответ

2 голосов
/ 21 сентября 2008

Я нашел сообщение на форумах Aptana (которого больше нет в сети), в котором говорится, что могут быть проксированы только глобальные функции ... Bummer.

Однако я поиграл, и вы можете контролировать, какие методы будут доступны на клиенте и на сервере, поместив ваш код во включаемый файл и используя теги <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" в сценариях общего доступа и сервера, чтобы они были доступны для прокси-функций.

...