2

这里有更多一般性问题。

目前,我从事的许多项目都利用服务器端视图来呈现用户界面,并在这里和那里使用一些 JavaScript 对其进行修饰。对于较小的项目来说,这一切都很好,但最近似乎 .js 文件的大小变得相当大,堆栈上的堆栈 .live 和 .bind jQuery 调用似乎不再削减它了。

有什么好的方法可以将 JavaScript 混合到视图中,或者可能是 Web 应用程序的控制器中?对于 Java 驱动的网站,我发现DWR 非常有用,但很多时候用户发起的事件需要控制器逻辑,当它是页面中包含的许多单独功能的一部分时,它开始变得不堪重负和令人困惑。

我考虑过一个完全由 AJAX 驱动的模板引擎,但这似乎有点极端,而且对于任何人来说都可能会让人头疼。另一方面,克隆现有后端类的功能似乎是多余的。

Web 应用程序使用的一种好的“中间立场”方法是什么,那些不是完全免费的 AJAX 也不是完全由 JavaScript 驱动的?

编辑: 也许我会提供一个问题的日常示例。假设我想为用户提供确认或否认某事的模态对话:

"Your picture is uploaded but looks terrible. You need a new 'do." (OK | What?)

现在,在一种情况下,由于上传带有页面刷新的图像,该对话框可能会弹出,在这种情况下,服务器端视图将呈现它。在另一种情况下,它可能会在通过 AJAX 上传图像后出现,这种情况下它可能会被页面上的 JavaScript 触发。在这两种情况下,我们都需要访问对话创建代码,到目前为止,我还想不出一种方法来拥有Dialog一个在两种情况下都可以正常工作的类。

4

5 回答 5

2

我当然不是这个领域的专家,但过去曾参与过利用 RESTful 服务的项目,这些服务似乎非常适合网站开发的“AJAXY”世界。我不能说它非常适合 Web 应用程序,但对于内容丰富的演示站点来说非常有用。似乎它可以通过自定义模板很好地满足您对多表示格式的需求。因此,该服务可以使用 HTML 页面模板调用图片上传服务,也可以调用该服务并请求 AJAX 组件模板。

于 2010-06-23T01:37:10.947 回答
1

您可以将所有逻辑都扔到服务器上,并假设一个愚蠢的客户端显示服务器发送的任何内容。

有两种情况:

  1. 非 Ajax 请求
  2. 阿贾克斯请求

它们之间的唯一区别是,在第一个中,您渲染的内容不仅仅是模态对话框。没有理由在服务器上不能有一个Dialog类来吐出对话框的 HTML 表示,并用于两种类型的请求。然后在 AJAX 调用中,您只需将服务器的响应添加到 DOM 中。

就像你说的,在客户端和服务器端共享 UI 创建逻辑可能会出现问题,所以最好选择一个并坚持下去。在上述情况下,所有逻辑都被推送到服务器。阅读更多关于AHAH的信息。

于 2010-06-23T03:45:32.303 回答
1

听起来Google Web Toolkit可能就是您正在寻找的东西。

它允许您用 Java 编写客户端应用程序并将它们部署为 JavaScript。

大概然后您可以用 Java 编写一次代码并在两个地方都使用它,尽管我自己从未使用过 GWT。

在我自己开发的框架中,我基本上是在强迫开发人员编写两次代码。一次是本地语言,一次是 JavaScript。我让他们填写一个返回 JS 的函数,然后可以在需要的地方自动调用它。但是所有代码都包含在一个类中,因此至少您不会将逻辑分散在所有地方,并且您可以快速比较它们是否在功能上等效。对于正则表达式之类的东西,它通常可以只写一次,然后传递给 JS(我用它在客户端验证一次,然后在服务器端再次验证)。

于 2010-06-23T03:58:30.940 回答
1

我最近一直在为内部公司应用程序使用JavascriptMVC (2.0)。它有它的缺点,但整体架构很好,允许您创建“控制器”JS 类。每个控制器“拥有”DOM 树的一个子集(或者如果您愿意,也可以是页面的可视部分)并响应该区域内的事件并使用EJS 模板(“视图”部分)来更改其下的区域。它很好地抽象了原本会很多的东西,$(...).bind()$(...).live()调用了 OOP 模型。

在我的例子中,由于项目的限制,我们的界面几乎 100% 由 JS 驱动,但没有理由不能混合搭配。

现在,在一种情况下,由于上传带有页面刷新的图像,该对话框可能会弹出,在这种情况下,服务器端视图将呈现它。还有一种情况,可能是通过AJAX上传图片后出现的,这种情况下很可能是页面上的JavaScript触发的

即使禁用了Javascript,我也会这样做:

  1. 服务器端输出一个 HTML 上传表单。纯 HTML 表单将提交到另一个 PHP 页面。
  2. 当页面完成加载时,会运行一段 Javascript,以查找该表单。
  3. javascript 创建一个HairdoUploadController实例,将 传递<form>...</form>给构造函数。
  4. 控制器“接管”表单,使用 JQuery 选择器更改样式并捕获表单提交事件。
  5. The controller adds a new div and associates it with a (initially hidden) Jquery-UI Dialog.
  6. When the form is submitted, the controller instead makes an AJAX call, to a slightly different URL than the plain form.
  7. The results of the AJAX call are pushed into the Dialog's div, and the dialog is displayed.
于 2010-06-23T20:58:27.440 回答
0

我最近发现自己使用我的服务器端代码(在我的例子中为 ASP.Net MVC)作为一种方法来提供对我的布局组件(主文件)和 UI 的小封装位(部分视图)的重用,并做一个javascript 中的大量工作。在这种特殊情况下,我的 UI 工作还处于早期阶段,但是使用 jQuery 和 jQuery UI,我已经在非常小的占用空间内获得了很多功能。

我认为拥有混合解决方案的挑战之一是弄清楚将各种逻辑放在哪里。在那之后,剩下的可能就是弄清楚如何尽可能多地重用你的 javascript 和 css 代码。我仍然没有弄清楚如何管理我最终使用的各种 javascript 工件(尽管 Google CDN 通过提供 jQuery、jQuery UI 和 jQuery UI CSS 资源来缓解很多问题)。

于 2010-06-23T01:37:26.987 回答