2

一些背景知识:我来自一个 .Net 环境,我们必须在所有项目中使用 MVVM 来将视图与视图模型分开。现在我正在处理我自己的个人 PHP 项目,我决定使用相同的设计并将视图和视图模型分开。

因此,在视图上,我创建了一个视图模型对象并在必要时调用后台函数,而在视图中,代码仅用于提供显示。

例子:

视图.php

<?php
include('viewmodel.php');

$vm = new viewmodel.php();

if(some condition)
{
  $vm->doSomething();
}
?>
<html>
<body>
//some form code
</body>
</html>

视图模型.php

<?php
//includes

class viewmodel
{
  function viewmodel()
  {
  }

  function doSomething()
  {
  }
}
?>

现在我已经学习了 jQuery,我想用它来使我的页面更加动态,减少往返服务器的流量,减少页面刷新的需要。

我见过这样的调用,它允许 jQuery 调用带有一些发布数据的 php 页面:

$.ajax({ url: '/my/site',
         data: {action: 'test'},
         type: 'post',
         success: function(output) {
                      alert(output);
                  }
});

但是,这不再是面向对象的设计,我必须从我的视图模型中删除所有类定义才能使其正常工作。

jQuery 有没有办法对视图模型进行这些调用,或者使用 jQuery 是否意味着您必须返回到程序化的编程风格?

4

1 回答 1

4

但是,这不再是面向对象的设计,我必须从我的视图模型中删除所有类定义才能使其正常工作。

什么让你有那个想法?向服务器发出 AJAX 请求并没有本质上是面向对象或非面向对象的。这些客户端发起的请求也与服务器端代码的架构没有任何关系。

在您的视图中,您可以拥有任何您想要的 JavaScript 代码。它不会对渲染视图的服务器端代码产生影响,因为 JavaScript 就它而言只是文本,与 HTML 没有什么不同。

至于服务器端处理程序,您可能想要做的是为 jQuery 代码调用的“页面”(“资源”是一个更准确的词)创建全新的视图和视图模型。

因此,例如,您可能会收到来自浏览器的请求,该请求/my/site将使用您现有的架构填充视图模型以绑定到视图并将该视图返回给客户端。该视图将包含一些 JavaScript 代码,其中一些调用另一个资源。假设其他资源类似于/api/products返回用户可用的“产品”列表。

请注意,我将资源放在不同的路径下,api而不是my. 这是一个相当武断的决定,它仅用于说明在这种情况下您返回的不是“页面”,而是自动化 API 的 JSON 数据。当然,资源的实际名称可以是您喜欢的任何名称。

该资源仍然可以是视图并绑定到视图模型,但在这种情况下,视图是 JSON 数据而不是 HTML。与任何事情一样,有很多方法可以做到这一点。一个快速的谷歌搜索出现了另一个问题,它讨论了几种生成 JSON 数据的方法之间的差异。实际上,在这种情况下,您的“视图”可能完全是空的,您所做的只是将视图模型序列化为 JSON 并返回它。(我的 PHP 相当生疏,但 ASP.NET MVC 等价物将返回一个ActionResultofJson()而不是View().)

Keep in mind that, from the perspective of the server-side code, there is no difference between returning a view in HTML vs. returning one in JSON (or XML, or raw text, or anything else). A view is a view, each one independent from the others.

于 2012-12-19T13:44:45.900 回答