Reputation: 1733
i'm trying to add an extender to all my observables in my viewmodel. my data come from the server so i can't specify the properties one by one.
i tried this but it doens't work, i'm using the logChange extender from the knockout js webpage for this example.
var addingExtender = {
key: function (data) {
return data.id;
},
create: function(options) {
return ko.observable(true).extend({ logChange: "Value Changed" });
}
};
ko.mapping.fromJS(data, addingExtender, self);
Upvotes: 0
Views: 819
Reputation: 41
Using Typescript Syntax, Recursively extending leaf observables
extendObservables(vm: object): void {
for (var observableKey in vm) {
if (!vm.hasOwnProperty(observableKey) || observableKey == "__ko_mapping__") {
continue;
}
if (ko.isObservable(vm[observableKey]) && typeof ko.unwrap(vm[observableKey]) === "object") {
this.extendObservables(ko.unwrap(vm[observableKey]));
} else if (ko.isObservable(vm[observableKey])) {
extendObservable(vm[observableKey]);
} else if (typeof vm[observableKey] === "object") {
this.extendObservables(vm[observableKey]);
}
}
}
Upvotes: 0
Reputation: 1733
I ended up doing a function to add the extender one by one.
function addStorage(koViewModel,name) {
for (var observableKey in koViewModel) {
if (ko.isObservable(koViewModel[observableKey])
&& !isObservableArray(koViewModel[observableKey])) {
koViewModel[observableKey].extend({ persist: name === undefined ?
url + observableKey : url + name + "." + observableKey });
}
if (typeof koViewModel[observableKey] === "object") {
for (var observables in koViewModel[observableKey]) {
if (ko.isObservable(koViewModel[observableKey][observables])
&& !isObservableArray(koViewModel[observableKey][observables])) {
koViewModel[observableKey][observables].extend({ persist: url +
observableKey + "." + observables });
}
}
}
}
}
Upvotes: 2