knockout mapping with computed fields

后端 未结 3 982
生来不讨喜
生来不讨喜 2020-12-30 15:16

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\         


        
相关标签:
3条回答
  • 2020-12-30 15:49

    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);
                    }));
                }
            }
        )
    };
    
    0 讨论(0)
  • 2020-12-30 15:58

    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/

    0 讨论(0)
  • 2020-12-30 16:05

    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.

    0 讨论(0)
提交回复
热议问题