【问题标题】:How to integrate AJAX into a MVC-style web application?如何将 AJAX 集成到 MVC 风格的 Web 应用程序中?
【发布时间】:2011-02-23 20:58:09
【问题描述】:

我正在使用一个非常简单(可能并不真正符合 MVC)的 MVC 框架开发一个 Web 应用程序,该框架由我自己在开发应​​用程序时进行编码以保持代码简洁。 不过,我的应用程序有许多 AJAX 组件,现在我被困在尝试将它们集成到通用 MVC 结构中。它们应该如何集成?

我的 Javascript 文件中有这样的内容:

$('#pageList').load(BASE_SITE_URL + 'ajax/pageList.php');

和 pageList.php 曾经有一个类似下面的结构:

<?php

require '../includes/config.inc.php';
require BASE_PATH . 'includes/init.inc.php';

// a whole load of Controller logic here and then...
echo "<table>";
//display some user data
echo "</table>";

我真的很困惑,感谢任何建议

【问题讨论】:

  • 不能真正回答有关 PHP 的问题,但在 Rails 中,您可以将 javascript 隐藏在您的视图旁边。例如为“view.html.erb”服务的“view.js.erb”。服务器反过来知道客户端请求 javascript 内容类型并且足够聪明地执行/生成正确的 javascript。

标签: php ajax model-view-controller


【解决方案1】:

一些提示 - 您的网站应该可以在没有 javascript 的情况下正常运行。例如,如果您使用 /list/?page=1 ... /list/?page=n 之类的页面 url 进行分页,那么您应该确保所有页面都是可点击的,而实际上不需要 javascript。

Javascript 应该是您网站的真正扩展。在上面的例子中,你可以回过头来使用 js 将所有分页的功能替换为一个简单的 ajax 行为。您可能想要做的是使用 jquery.load 执行以下操作:

$("div.content").load("/list/?page=2 div.content > *");

注意加载后的选择器。这非常重要,因为我实际上并没有创建任何新的 HTML 页面来启用我的网站 AJAX。相反,我使用浏览器已经可用的内容作为简单的 URL,并使用 ajax 加载它。

当然,有时您需要仅 AJAX 的内容,而这些内容实际上并不存在于 URL 中。在这种情况下,我建议为所有 ajax 内容创建一个控制器,然后使用视图渲染每个路径。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是我在我的应用中所做的:

    检查名为XMLHttpRequest$_SERVER 变量。如果已设置,则它是一个 ajax 请求,然后您可以执行一些逻辑,以便您的代码不加载视图(模板等等)并输出不同的 header()(如果有)..

    【讨论】:

      【解决方案3】:

      我通常有一个与每个视图相关的 js 脚本,称为 update.js。它的作用是定义用户如何与视图交互并创建 HTTPREQUEST。 然后我有一个名为 controller.js 的文件接收它,决定如何处理这个请求 并要求模型做出回应。 最后,属于视图的 update.js 使用从模型接收到的新信息更新视图。

      我的app目录结构是这样的:

      型号/

      • model.class.php
      • business.php

      控制器/

      • controller.php
      • controller.js

      查看/

      • view.php
      • update.js

      index.php

      我按角色而不是类型来组织文件。我认为这是使用 AJAX 实现 MVC 模式的最佳方法。请记住,这种模式的目的是保持封装性和可扩展性,这对我来说是最好的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-25
        • 2020-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多