この問題には、計算されたプロパティ名 ( 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