I am making a small app for countdown timer in which i have used knockout css binding with multiple classes. Now, the problem is if i am writing the logic in separate handler it is working fine but if trying to implement the same logic inline with css binding its not working as required.
Working version: http://jsfiddle.net/gzejF/3/
<div class="dateTimer" data-bind="timer: startTime, timerOptions: {speed: 1000}">
<div class="tens">
<div class="upperTensClock timerLine"></div>
<div class="lowerTensClock timerLine"></div>
</div>
<div class="units">
<div class="upperClock timerLine"></div>
<div class="lowerClock timerLine"></div>
</div>
</div>
Not working version: http://jsfiddle.net/K6m93/
<div class="dateTimer">
<div class="tens">
<div class="upperTensClock" data-bind="css: {
'l1 l2 l3': tens() == 0,
'l3': tens() == 1,
'l2 l3 l7': tens() == 2 || tens() == 3,
'l1 l3 l7': tens() == 4,
'l1 l2 l7': tens() == 5 || tens() == 6,
'l2 l3': tens() == 7,
'l1 l2 l3 l7': tens() == 8 || tens() == 9
}"></div>
<div class="lowerTensClock" data-bind="css: {
'l4 l5 l6': tens() == 0 || tens() == 6 || tens() == 8,
'l4': tens() == 1 || tens() == 4 || tens() == 7 || tens() == 9,
'l5 l6': tens() == 2,
'l4 l5': tens() == 3 || tens() == 5
}"></div>
</div>
<div class="units">
<div class="upperClock l1 l2 l3 l7" data-bind="css: {
'l1 l2 l3': units() == 0,
'l3': units() == 1,
'l2 l3 l7': units() == 2 || units() == 3,
'l1 l3 l7': units() == 4,
'l1 l2 l7': units() == 5 || units() == 6,
'l2 l3': units() == 7,
'l1 l2 l3 l7': units() == 8 || units() == 9
}"></div>
<div class="lowerClock l4 l5 l6" data-bind="css: {
'l4 l5 l6': units() == 0 || units() == 6 || units() == 8,
'l4': units() == 1 || units() == 4 || units() == 7 || units() == 9,
'l5 l6': units() == 2,
'l4 l5': units() == 3 || units() == 5
}"></div>
</div>
</div>
It seems like in inline css binding if condition is true then its applying the class but when checking next statement which is false it removes the class added in previous step. Is there any workaround for this inline css check because lots of switch statements are not looking good in the working code.
KO is able to create a two-way binding if you use value to link a form element to an Observable property, so that the changes between them are exchanged among them. If you refer a simple property on ViewModel, KO will set the form element's initial state to property value.
Binding Values The binding value can be a single value, literal, a variable or can be a JavaScript expression.
Class Binding in Angular Class binding is used to set a class property of a view element. We can add and remove the CSS class names from an element's class attribute with class binding. The class binding syntax is also like property binding. In property binding, we only specify the element between brackets.
A data binding connects data from a custom element (the host element) to a property or attribute of an element in its local DOM (the child or target element). The host element data can be a property or sub-property represented by a data path, or data generated based on one or more paths.
I just needed this today, I prefer the multiple CSS class binding noted on the docs.
You can set multiple CSS classes at once. For example, if your view model has a property called isSevere.
<div data-bind="css: { profitWarning: currentProfit() < 0, majorHighlight: isSevere }">
You can even set multiple CSS classes based on the same condition by wrapping the names in quotes like:
<div data-bind="css: { profitWarning: currentProfit() < 0, 'major highlight': isSevere }">
You can use a computed function to get the CSS. Something like this:
html:
<div class="upperTensClock" data-bind="css: upperTenCSS()"></div>
Javascript:
self.upperTenCSS = ko.computed(function() {
switch(self.tens()) {
case 0:
return 'l1 l2 l3';
case 1:
return 'l3';
case 2:
case 3:
return 'l2 l3 l7';
case 4:
return 'l1 l3 l7';
case 5:
case 6:
return 'l1 l2 l7';
case 7:
return 'l2 l3';
case 8:
case 9:
return 'l1 l2 l3 l7';
}
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With