dk1*_*123 19 javascript knockout.js
我有一点javascript:
function ViewModel() {
var self = this;
self.highlight = ko.observable(true);
}
ko.applyBindings(new ViewModel());
Run Code Online (Sandbox Code Playgroud)
和补充它的HTML:
<div data-bind="css: { highlighted: highlight }, click: highlight( !highlight() )">
random string
</div>
Run Code Online (Sandbox Code Playgroud)
我想要实现的目标:
我得到了什么:
true,但是css类开始停用(如果我将初始值更改为false,则激活css类:这似乎就在我尚未点击任何内容时以某种方式触发了click绑定)我宁愿不在ViewModel中创建一个新的相应的点击功能.我正在寻找可能的一些代码,我可以在data-bind中单独内联.
这是JSFiddle上的代码:http://jsfiddle.net/4wt4x/1/
谁能解释发生了什么以及我做错了什么?
Kim*_*jan 42
我知道这是一个老问题,但也许可以帮助别人.如果你需要在很多地方使用切换,也许一些自定义绑定糖可以帮助你:
捆绑:
ko.bindingHandlers.toggleClick = {
init: function (element, valueAccessor) {
var value = valueAccessor();
ko.utils.registerEventHandler(element, "click", function () {
value(!value());
});
}
};
Run Code Online (Sandbox Code Playgroud)
用法:
<div data-bind="css: { highlighted: highlight }, toggleClick: highlight">
random string
</div>
Run Code Online (Sandbox Code Playgroud)
例:
这种方法使我的一些观点更加清晰.希望能帮助到你.
Los*_*les 21
你click: highlight( !highlight() )的不对.Click将尝试执行一个函数,并且当初始化绑定时,突出显示将返回其值的任何值,这将是单击将尝试执行(true或false在您的情况下).你需要做这样的事情:
在您的JavaScript中,放置在您的模型中:
self.toggleHighlight = function () { self.highlight(!self.highlight()) };
Run Code Online (Sandbox Code Playgroud)
然后改变绑定来说 click: toggleHighlight
像这样:http://jsfiddle.net/KDypD/1/
您可能还需要调整突出显示的初始值,以反映您希望页面最初显示的方式.
小智 7
另一种选择是使用可重复使用的自定义函数扩展(使用自定义函数代替扩展器,因为没有参数,它看起来更干净):
ko.observable.fn.toggleable = function () {
var self = this;
self.toggle = function () {
self(!self());
};
return self;
};
Run Code Online (Sandbox Code Playgroud)
用法
self.highlight = ko.observable(true).toggleable();
Run Code Online (Sandbox Code Playgroud)
HTML
<div data-bind="css: { highlighted: highlight }, click: highlight.toggle">
random string
</div>
Run Code Online (Sandbox Code Playgroud)