我提出了一种在Meteor应用程序中制作可编辑文本的方法。然而,它没有遵循DRY范式,我想改变这一点,但我还不太擅长Javascript。。。
假设我有一个包含一些文本的表格单元格,我想双击它进行编辑
<td class="itemName">
{{#unless editItemName}}
{{name}}
{{else}}
<input class="editItemName" type="text" value="{{name}}" style="width:100px;">
{{/unless}}
</td>
然后我创建一个事件,在双击时执行这个转换:
Template.inventoryItemDetail.events = {
'dblclick td.itemName': function (evt) {
Session.set("editItemName",true);
},
'blur input.editItemName': function () {
Session.set("editItemName",null);
},};
我还重用了ToDo示例应用程序中的ok_cancel代码(但这有点无关紧要):
// Returns an event_map key for attaching "ok/cancel" events to
// a text input (given by selector)
var okcancel_events = function (selector) {
return 'keyup '+selector+', keydown '+selector+', focusout '+selector;
};
// Creates an event handler for interpreting "escape", "return", and "blur"
// on a text field and calling "ok" or "cancel" callbacks.
var make_okcancel_handler = function (options) {
var ok = options.ok || function () {};
var cancel = options.cancel || function () {};
return function (evt) {
if (evt.type === "keydown" && evt.which === 27) {
// escape = cancel
cancel.call(this, evt);
evt.currentTarget.blur();
} else if (evt.type === "keyup" && evt.which === 13) {
// blur/return/enter = ok/submit if non-empty
var value = String(evt.target.value || "");
if (value) {
ok.call(this, value, evt);
evt.currentTarget.blur();
}
else {
cancel.call(this, evt);
evt.currentTarget.blur();
}
}
};
};
Template.inventoryItemDetail.events[ okcancel_events('input.editItemName') ] = make_okcancel_handler({
ok: function (value) {
Items.update(this._id, {$set: {name: value}});
}
});
最后,我必须将这个Session变量与模板变量联系起来:
Template.inventoryItemDetail.editItemName = function () {
return Session.get("editItemName");
};
所以现在,我已经为每个可编辑的文本字段一次又一次地重复了所有这些,而且都很有效,但这似乎是一种糟糕的编程实践。我在Github上找到了各种可编辑的文本实用程序,但我并不完全理解它们,也没有一个适用于Meteor!
我真的很想通过创建一个工具来扩展我对Meteor和Javascript的了解,这个工具可以让我拥有可编辑的文本,而不会为每个可编辑文本字段重复这么多荒谬的内容。
谢谢,
检查
https://github.com/nate-strauser/meteor-x-editable-bootstrap包裹。
http://vitalets.github.io/x-editable/docs.html用于文档。
我刚刚在我的项目中实现了这一点,我再也不会回到contenteditable
了。