Skip to content

Instantly share code, notes, and snippets.

@smailliwcs
smailliwcs / cache.js
Created September 22, 2020 15:24
Knockout extender: cache
ko.extenders.cache1 = function (target) {
target.cached = ko.observable(target.peek());
target.cache = function () {
target.cached(target());
};
return target;
};
var x = ko.observable(1).extend({ cache1: {} });
x(2);
@smailliwcs
smailliwcs / coalesce.js
Created September 22, 2020 15:24
Knockout extender: coalesce
ko.extenders.coalesce = function (target, defaultValue) {
var result = ko.computed({
read: function () {
return target() === undefined ? ko.unwrap(defaultValue) : target();
},
write: function (value) {
target(value);
}
});
result.defaultValue = ko.computed(function () {
@smailliwcs
smailliwcs / filter.js
Created September 22, 2020 15:24
Knockout extender: filter
ko.extenders.filter = function (target, pattern) {
var result = ko.computed({
read: target,
write: function (value) {
if (typeof value !== "string") {
target(value);
return;
}
var current = target();
var filtered = value.replace(pattern, "");
@smailliwcs
smailliwcs / numeric.js
Created September 22, 2020 15:24
Knockout extender: numeric
function log(value) {
console.log(typeof value + ": " + value);
}
ko.extenders.numeric1 = function (target) {
return ko.computed({
read: target,
write: function (value) {
var number = parseFloat(value);
target(isNaN(number) ? value : number);
@smailliwcs
smailliwcs / observe.js
Created September 22, 2020 15:24
Knockout extender: observe
ko.extenders.observe = function (target, source) {
target(source);
var result = ko.computed({
read: function () {
return target()();
},
write: function (value) {
target()(value);
}
});
@smailliwcs
smailliwcs / slide.html
Created September 22, 2020 15:24
Knockout binding handler: slide
<script type="text/javascript">
ko.bindingHandlers.slide = {
enabled: true,
queue: "ko.bindingHandlers.slide",
init: function (element, valueAccessor) {
var visible = Boolean(ko.unwrap(valueAccessor()));
$(element).toggle(visible);
},
@smailliwcs
smailliwcs / sortable.html
Created September 22, 2020 15:24
Knockout binding handler: sortable
<script type="text/javascript">
ko.bindingHandlers.sortable = {
normalize: function (valueAccessor) {
var value = ko.unwrap(valueAccessor());
if (typeof value === "object" && "data" in value) {
return value;
} else {
return { data: valueAccessor() };
}
},
@smailliwcs
smailliwcs / tooltip.html
Created September 22, 2020 15:24
Knockout binding handler: tooltip
<script type="text/javascript">
ko.bindingHandlers.tooltip = {
normalize: function (valueAccessor) {
var value = ko.unwrap(valueAccessor());
if (typeof value === "object" && "data" in value) {
return value;
} else {
return { data: value };
}
},
@smailliwcs
smailliwcs / validationPopover.html
Created September 22, 2020 15:24
Knockout binding handler: validationPopover
<script type="text/javascript">
ko.bindingHandlers.validationPopover = {
init: function (element, valueAccessor, allBindings) {
if (!allBindings.has("value")) {
return;
}
var $element = $(element);
var value = allBindings.get("value");
$element.popover($.extend({}, ko.unwrap(valueAccessor()), {
content: function () {
@smailliwcs
smailliwcs / toggler.js
Created September 22, 2020 15:24
jQuery UI widget: toggler
$.widget("scw.toggler", {
options: {
active: true,
animated: true,
duration: "_default",
cssClass: "toggler-active"
},
_finish: function () {
while (this.element.queue().length > 0) {