通过计算属性名称(对于FF>34、Chrome、Safari>7.1 )有一个更优雅的解决方案:
<div data-bind="css: { [color]: true,'translucent': number() < 10 }">
static dynamic css classes
</div>
而color
是具有字符串值的属性。
如果 的值color
是可观察的,那么我们需要在可观察更新之前清除类名。如果我们不这样做,那么每次更改都会添加另一个类,而不是删除前一个类。这可以很容易地手动完成,但我为感兴趣的人编写了一个扩展器。
ko.extenders.css = function(target, value) {
var beforeChange;
var onChange;
//add sub-observables to our observable
target.show = ko.observable(true);
beforeChange = function(oldValue){
target.show(false);
}
onChange = function(newValue){
target.show(true);
}
target.subscribe(beforeChange, null, "beforeChange");
target.subscribe(onChange);
return target;
};
使用此扩展器,您的 JavaScript 代码将如下所示:
function MyViewModel() {
this.color = ko.observable("red").extend({ css: true });
this.number = ko.observable(9)
};
你的标记会很简单:
<div data-bind="css: { [color()]: color.show(),'translucent': number() < 10 }">
static dynamic css classes
</div>
我有一个演示这种技术的代码笔:http:
//codepen.io/USIUX/pen/WryGZQ
我还提交了一个关于敲除的问题,希望有一天不需要自定义扩展器:https ://github.com/knockout/knockout/issues/1990