是否有一個特定的原因,大多數人都實現了就地編輯,如同一個顯示的'顯示'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應用程序和backbone.js等框架,似乎我們可以根據需要隨時渲染就地編輯表單元素,從而使我們的代碼更加乾爽,甚至可以制定工廠方法來確定哪個表單元素渲染。例如
- 與類「標題」的H1元件由
<input type="text" />
- 與類跨度替換「year_founded」由
<input type="number" min="1900" max="2050" />
- 與類「價格」的跨度代替由輸入替換爲適當掩碼只允許輸入價格。
這種做法是將所有就地編輯表單元素渲染爲服務器端呈現頁面時留下的歷史遺留物嗎?
鑑於我們在客戶端MVC框架(如Backbone.js)方面具有的靈活性和強大功能,是否有必要使用工廠方法創建並插入表單元素時有必要?事情是這樣的:
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是一個工廠,返回基於標記名的相應的編輯就地表單元素類型。這個工廠視圖還控制了它自己的邏輯,用於保存編輯,取消編輯,向服務器發出請求並重新渲染被替換爲.html()函數的適當原始元素?
在我看來,如果我們使用這種方法,那麼我們也可以渲染基於用戶的編輯權限,像這樣的飛<span class="edit_button"></span>
按鈕:
<h1 id="title">
<%= document.get("title") %>
</h1>
<% if (user.allowedToEdit(document, title)) { %>
<span class="edit_glyph"></span>
<% } %>
其中用戶模型allowedToEdit函數接受作爲參數的模型和屬性。
不知道問題在哪裏。我不知道你提出的任何「最佳」解決方案。兩者對我都好。你提到的唯一的不是沒有的事情是讓JavaScript處理你的應用程序的權限。 JS可以很容易地玩,所以請確保您的後端雙打檢查所有客戶端的變化。 – Julien 2011-02-25 19:41:08
@Julien是的,我們計劃在服務器端檢查一切。客戶端的所有特權處理都是針對可用性和用戶體驗問題。我不想渲染用戶不能使用的頁面上的任何元素。例如如果他們沒有編輯權限,那麼他們應該能夠看到編輯按鈕。我的問題是,爲什麼默認情況下在頁面上顯示「顯示」和「編輯」div,而不是在需要時使用工廠來構建必要的就地編輯表單? – 2011-02-26 01:59:37
我很想知道,作爲一個正在考慮爲我的應用程序使用Backbone的人......在我看來,你的方式是有道理的,儘管我對「工廠」有點困惑。這是爲了減少「對於這個顯示視圖,渲染這個命名的編輯視圖」,所以你可以說,「這個顯示視圖是單行文本,工廠請給我一個單行編輯視圖」? – kamranicus 2011-12-13 03:32:22