我有一个使用 Zend Framework 构建的应用程序。我决定使用 JQuery 而不是 Dojo。我确实使用 ZendX 助手来处理 ajaxLinks 和dialogContainers 等内容。我想尝试使 GUI 尽可能由 AJAX 驱动。但我很难决定我认为最好的方法。 大多数时候,只需将“页面”加载到对话框容器中,而不是重新加载整个页面。例如,您会得到一个对话框,其中包含用于更改某些用户数据或类似内容的表单。
一开始我返回了整个页面,但如果使用 AJAX 请求进行请求,它会使用不同的布局模板来避免所有 unenecerry javascript 包含等。这使我能够构建一个基本上可以像正常情况一样浏览的页面版本并通过 AJAX。但我还没有说服自己我喜欢这个。看看 Zend Server GUI,他们似乎这样做了,但没有返回 json 编码数据并从中构建页面。
最好的方法是什么?我应该如何处理特定于检索页面的 JavaScript?我现在在该页面的 phtml 文件中拥有所有页面特定的 javascript。
我关心的另一件事是如何跟踪打开大量对话框容器并通过 ajax 填充它们时创建的资源。假设我们打开一个对话框,并在其中获得一个项目列表。如果我们单击另一个模式对话框容器,则会弹出该特定项目并通过 ajax 填充。但如果主页从未重新加载,我可以看到这变得很难处理。
感觉我不可能是第一个想做 ajax 驱动的 UI 的人,所以在我把自己逼到墙角之前,请给我指出正确的方向。 ;)
更新:我基本上尝试了所有我能找到的关于上下文主题的教程以及 Zend 的文档。我想我一定错过了启用一些未记录的功能或其他东西。由于它不起作用,我删除了代码,但试图找到我在尝试以下代码之类的内容之前查看的示例。
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('list', 'html')
->addActionContext('modify', 'html')
->initContext();
我尝试了类似以下的内容
$this->_helper->contextSwitch()
->setContext('html', array(
'suffix' => 'html',
'headers' => array('Content-Type' => 'text/html; Charset=UTF-8'),
)
)
->addActionContext('index', array('html','xml', 'json'))
->setAutoJsonSerialization(true)
->initContext();
我尝试添加其他 ActionContext 等,但无论如何它们最终都始终呈现正常的 .phtml 文件。
最佳答案
这是我在制作 ZF/Ajax 应用程序时学到的东西。
对于 HTML 数据:
您可以使用 ActionContext 操作助手 ( ZF Reference )。您可以将 AJAX 上下文添加到您的操作中。我在 Controller 的 init() 函数中使用它。
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('myaction', 'html')->initContext('html');
它的作用是,当调用 myactionAction() 时,它将检查请求是否是通过 AJAX 调用发出的。如果是,它会禁用布局,并呈现“myaction.ajax.phtml”,而不是“myaction.phtml”,就像不是 AJAX 调用时那样。这样,您就可以从操作中获得干净的 HTML 输出,而无需任何额外的内容,您不必在每个操作中编写请求类型检查代码。我发现它通常很容易使用。
如果您正在加载的内容带有额外的 JavaScript,请不要忘记将其添加到您的 View 中并回显它。
$this->headScript()->appendFile("/js/list.js");
echo $this->headScript();
然后该 JavaScript 将像平常一样执行。
对于 JSON 数据
JSON Action Helper 在返回 JSON 数据的操作中非常快速且易于使用。
$r = "Success";
$this->_helper->json($r);
这也返回纯 JSON,不返回任何其他内容。
我想更具体的问题会帮助您获得更好的答案。
关于jquery - 如何使用 Zend Framework 制作基于 AJAX 的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4899303/