2

私はJaxerで遊んでいますが、コンセプトは非常にクールですが、クライアントとサーバーの両方で使用できるオブジェクトを定義する方法がわかりません。私が見つけることができる例は、オブジェクトをまったく定義していません。

オブジェクトを定義し、サーバーで使用できるメソッド、クライアントで使用できるメソッド、およびクライアントで使用できるがサーバーで実行されるメソッド (サーバープロキシ) を指定できるようにしたいと考えています。これは、異なる属性<scriptを持つ 3 つの個別の > タグを 使用せずに実行できますか? runat可能であれば、同じ js ファイルですべてのメソッドを定義できるようにしたいのですが、3 つの個別のタグを使用して html でオブジェクトをインラインで定義するのは現実的ではありません...

基本的に、これを 1 つの 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 ページに正しく含めることができますか?

4

1 に答える 1

2

Aptana フォーラム (Web 上にはもう存在しません) で、グローバル関数のみをプロキシできるという投稿を見つけました...残念です。

ただし、いろいろ試してみたところ、コードをインクルード ファイルに配置し、属性付きの<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"プロキシ関数で使用できるように、共有スクリプトとサーバー スクリプトで使用したことに注意してください。

于 2008-09-21T04:25:24.560 に答える