我遇到了这样一种情况,即代码和表示分离的重要原则在 Web 应用程序开发中产生了问题,其中存在两个独立的部分:客户端和服务器。我不确定如何在没有技巧的情况下同时在两端遵守这一原则。
考虑一个带有服务器端模板的示例,生成一个客户端网页 ( view
),它应该知道服务器端model
参数,以便可以将它们发送回服务器。例如,它可能看起来像这样:
<!-- File: form.template -->
<form id="main" name="main">
<input type="button" id="do" class="buttons" value="Do" onclick="requestDoFor(%modelid%)"/>
</form>
这样的模板用于与代码适当分离的服务器上(例如,在 php 中,使用抽象模板引擎):
$templateEngine->create('form.template', array('modelid' => $value))->render();
问题是模板不符合客户端的代码分离原则。生成的视图实际上应该没有任何 JavaScript,即onclick
处理程序应该来自模板:
<input type="submit" id="do" class="buttons" value="Do" />
到一个单独的 JavaScript 文件:
$('#do').click(function(){requestDoFor(%modelid%);});
问题是如何将模型参数传递给客户端的这部分,这不是view
(其实这是客户端的一部分controller
),并且不是由服务器端模板引擎生成的?我可以想象模板中的快速解决方法:
<input type="submit" id="do" class="buttons" value="Do" objectid="%modelid%" />
和 JavaScript 中的类似内容:
$('#do').click(function(event){requestDoFor($(event.target).attr('objectid'))});
但它看起来并不完美。有没有更好的办法?
我知道有些人完全用 JavaScript 生成视图,然后在浏览器中生成 DOM 元素,但这种方法有其自身的缺点。还有什么可以建议的?