我想要學習使用jQuery插件Uniform JS進行樣式化的相當複雜的動態表單,同時學習Knockout。由於Knockout是動態構建表單的一部分,所以我需要確保Uniform JS保持並動態生成動態生成的表單元素。在Knockout模板中使用Uniform JS進行表格元素的初始化
經過一番搜索,我找到了Mikhail Temkine的一篇博客文章「Knockout JS knockouts」,解釋瞭如何編寫自定義Knockout綁定來解決統一風格複選框的問題。自定義綁定看起來像這樣:
ko.bindingHandlers.checkedUniform = {
init: function (element, valueAccessor) {
ko.bindingHandlers.checked.init(element, valueAccessor);
},
update: function (element, valueAccessor) {
ko.bindingHandlers.checked.update(element, valueAccessor);
$.uniform.update($(element));
}
};
簡化HTML看起來是這樣的:
<ul data-bind="foreach: items">
<li data-bind="text: name, click: $root.editItem, css: {bold: bolded()}"></li>
</ul>
<div data-bind="with: selectedItem">
Edit list item: <input data-bind="value: name" />
Make it bold: <input type="checkbox" data-bind="checkedUniform: bolded />
</div>
自定義綁定顯然使用uniform.update()
方法,應該刷新風格的複選框的狀態。不幸的是,它不工作。複選框根據所選的統一設計模板進行樣式設計,但只要重新呈現Knockout模板(在此情況下selectedItem
發生更改時),顯示覆選框是否被打勾的指示器將丟失。複選框仍然有效,您可以點擊它們來切換它們的狀態,只是它們總是顯示爲未選中狀態。
我創建了一個簡單的jsfiddle來演示該問題:
http://jsfiddle.net/tomas_eklund/RaSpK/1/
謝謝!什麼讓我失望的是,複選框始終使用Uniform JS模板進行樣式設置(並且從未恢復到默認的未設置狀態)。即使是動態添加的也是正確的樣式(除了複選標記)。所以我錯誤地認爲Uniform JS在某種程度上仍然控制着複選框。但是,當然,因爲我在應用Knockout綁定之前將Uniform JS樣式應用於整個表單,所以Uniform JS已經將樣式化HTML注入到Knockout後來變成模板的DOM節點中。 –