I\'m getting data from a WCF service,and i map, and bind the data with my DOM object :
var PayinyVM = {};
$.getJSON(\'/service/PaidService.svc/PaidList\
Turns out I have to define all view model properties inside javascript so that knockout can initialize the view model with properties, before I update it with server data
Reference: http://www.underwatergorilladome.com/how-to-use-knockouts-computed-observables-with-the-mapping-plugin/
http://jsfiddle.net/GLDxx/2/
var model = {
username : ko.observable(),
get_student_info : ko.mapping.fromJS(
{
usr_lname : null,
usr_fname : null,
gender : null,
dob : null
},
{
create: function(options) {
return (new (function () {
this.name = ko.computed(function () {
if (this.usr_lname == undefined || this.usr_fname == undefined)
return null;
else
return this.usr_lname() + ' ' + this.usr_fname();
}, this);
// let the ko mapping plugin continue to map out this object, so the rest of it will be observable
ko.mapping.fromJS(options.data, {}, this);
}));
}
}
)
};
Here's a working copy of your fiddle, I had to make a lot of assumptions as your fiddle wasn't even correct javascript and seemed quite confused and didn't even reference knockout
var PaidPeople = function(data) {
var self = this;
ko.mapping.fromJS(data, {}, this);
this.fullName = ko.computed(function () {
return self.Name() + " : just ";
});
}
var PayinyVM = function (data) {
var self = this;
ko.mapping.fromJS(data, {
'model' : {
create: function(options) {
return new PaidPeople(options.data);
}
}
}, self);
};
var data = {model:[{__type: "PaidPeople:#model", Amount:110, Attendee:1, Name:'John'}]};
ko.applyBindings(new PayinyVM(data));
and a fiddle that works : http://jsfiddle.net/qeUHd/
You can invert the mapping by creating a model object that is mapped internally.
var PayinyVM = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
this.fullName = ko.computed(function () {
return self.Name() + " : just ";
});
};
$.getJSON('/service/PaidService.svc/PaidList', function (data) {
ko.applyBindings(new PayinyVM(data.d));
});
Hope this helps.