是否有一个特定的原因,大多数人都将就地编辑实现为显示的“显示”div和隐藏的“编辑”div,当有人像这样点击相关的“编辑”按钮时,它们会打开和关闭?
<div id="title">
<div class="display">
<h1>
My Title
</h1>
</div>
<div class="edit">
<input type="text" value="My Title" />
<span class="save_edit_button"></span>
<a href="#" class="cancel_edit">Cancel</a>
</div>
</div>
我到处看,我看到就地编辑基本上是这样处理的。当您在服务器端渲染所有视图并将它们交付给客户端时,这种方法当然是有意义的。然而,对于纯 AJAX 应用程序和像主干.js 这样的框架,我们似乎可以通过在必要时动态渲染就地编辑表单元素来使我们的代码更加干燥,甚至可能创建一个工厂方法来确定哪个表单元素渲染。例如
- 一个带有“title”类的 H1 元素被替换为
<input type="text" />
- 具有“year_founded”类的跨度被替换为
<input type="number" min="1900" max="2050" />
- 具有“价格”类的跨度被具有适当掩码的输入替换,仅允许输入价格。
这种渲染所有就地编辑表单元素的做法是否是在服务器端渲染页面时遗留下来的历史遗留问题?
鉴于我们使用 Backbone.js 等客户端 MVC 框架所具有的灵活性和强大功能,是否有理由不使用工厂方法在必要时动态创建和插入表单元素?像这样的东西:
HTML
<div id="description">
Lorem ipsum dolar set amit...
</div>
<span class="edit_button"></span>
Backbone.js 视图
events: {
"click .edit_button": "renderEditInPlaceForm",
},
renderEditInPlaceForm: function:(e) {
var el = $(e.currentTarget).previous();
var id = el.attr('id');
var value = el.text();
var tagName = el.tagName();
var view = new editInPlaceForm({
id: id,
type: tagName,
value: value
});
$("#id").html(view.render().el)
},
其中 editInPlaceForm 是一个工厂,它根据 tagName 返回适当的就地编辑表单元素类型。这个工厂视图还控制它自己的所有逻辑,用于保存编辑、取消编辑、向服务器发出请求以及重新渲染被 .html() 函数替换的适当原始元素?
在我看来,如果我们使用这种方法,那么我们还可以<span class="edit_button"></span>
根据用户的编辑权限即时渲染按钮,如下所示:
<h1 id="title">
<%= document.get("title") %>
</h1>
<% if (user.allowedToEdit( document, title )) { %>
<span class="edit_glyph"></span>
<% } %>
其中用户模型上的 allowedToEdit 函数接受模型和属性作为其参数。