我无法解决此问题:http://jsfiddle.net/2jg2F/1/
我基本上想要在有人点击文本时创建一个更改为输入框的链接。我尝试过淘汰赛2.0和2.1。
HTML
<div data-bind="clickToEdit : message"> </div>
的Javascript
ko.bindingHandlers.clickToEdit = {
init: function(element, valueAccessor) {
var observable = valueAccessor(),
link = document.createElement("a"),
input = document.createElement("input");
element.appendChild(link);
element.appendChild(input);
observable.editing = ko.observable(false);
ko.applyBindingsToNode(link, {
text: observable,
visible: !observable.editing,
click: function() {
observable.editing(true);
}
});
ko.applyBindingsToNode(input, {
value: observable,
visible: observable.editing,
hasfocus: observable.editing
});
}
};
function ViewModel() {
this.message = ko.observable("Click on me to edit");
}
ko.applyBindings(new ViewModel());
答案 0 :(得分:4)
你的问题就在这一行:
visible: !observable.editing
这将评估为false并将保持这种状态。即使你做!observable.editing()
,它也将是一个静态真值。
因此,有几种方法可以处理它:
1 - 一个不错的选择是创建一个快速hidden
绑定处理程序,它只是将相反的值传递给可见绑定。有几种方法可以编写它,但这是一种简单的方法:
ko.bindingHandlers.hidden = {
update: function(element, valueAccessor) {
var isVisible = !ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.visible.update(element, function() { return isVisible; });
}
};
现在,您可以使用:
hidden: observable.editing
以下是一个示例:http://jsfiddle.net/rniemeyer/2jg2F/2/
2 - 另一个选择是添加一个返回相反的计算observable。类似的东西:
observable.editing = ko.observable(false);
observable.notEditing = ko.computed(function() {
return !observable.editing();
});
然后,绑定notEditing
,如: