我一直在玩Jaxer,虽然这个概念非常酷,但我无法弄清楚如何定义客户端和服务器上都可用的对象。我找不到任何例子都可以定义对象。
我希望能够定义一个对象并指定服务器上可用的哪些方法,这些方法将在客户端上可用,哪些可在客户端上使用但在服务器上执行(服务器代理)。这可以在不使用三个单独的<script
&gt;的情况下完成。标签具有不同的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页面中?
答案 0 :(得分:2)
我在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"
,以便代理函数可以使用它们。