Pytanie w sprawie knockout-mapping-plugin, knockout.js – mapowanie knockout z polami obliczonymi

5

Dostaję dane z usługi WCF i mapuję oraz wiążę dane z moim obiektem DOM:

var PayinyVM = {};

    $.getJSON('/service/PaidService.svc/PaidList', function (data) {
        var tmp = JSON.stringify(data.d);

        PayinyVM.model = ko.mapping.fromJSON(tmp);
        ko.applyBindings(PayinyVM);
    }); 

wynik pokazany jest jako wyłączony w moim DOM powiązać go z modelem. Nie mogłem się dowiedzieć, jak dodać pewne obliczalne obserwowalne, powiedzmy, że moje dane zwracają ludzi z FirstName i LastName, jak mogę zrobić obliczoną obserwowalną FullName z FN + '' + LN.

Twoja odpowiedź

3   odpowiedź
4

tworząc obiekt modelu odwzorowany wewnętrznie.

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));
});

Mam nadzieję że to pomoże.

Wierzę, że to działa skrzypce ...jsfiddle.net/grimreaper01/caKrR Vyache
Niewiele problemów z twoim skrzypkiem. Dane nie są prawidłowe json. Przekaż je do JSONLint i zobacz. Brakujący nokaut w zasobach. Planowałeś własność modelu, która nie istnieje. Oto jak powinno być.jsfiddle.net/madcapnmckay/nWTMf/3 Jeśli spodziewasz się tablicy obiektów, należy ją odebrać jako {arrayName: [..]}, a następnie foreach będzie na arrayName. madcapnmckay
Również jeśli chcesz poradzić sobie z tablicami obiektów, powinieneś przeczytać dokumenty na opcjach wtyczek mapowania. Potrzebny będzie drugi obiekt modelu, np. PersonVM. madcapnmckay
var PayinyVM = function (dane) {var self = this; ko.mapping.fromJS (dane, {}, self); this.fullName = ko.computed (function () {return self.Name () + ”: just";}); }; $ .getJSON ('/ service / PaidService.svc / PaidList', funkcja (dane) {var tmp = JSON.stringify (data.d); PayinyVM.model = new PayinyVM (JSON.parse (tmp)); // ko .mapping.fromJSON (tmp); ko.applyBindings (PayinyVM);}); Frenchi In LA
2

że muszę zdefiniować wszystkie właściwości modelu widoku wewnątrz javascript, aby knockout mógł zainicjować model widoku właściwościami, zanim zaktualizuję go danymi serwera

Odniesienie: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);
                }));
            }
        }
    )
};
Po spędzeniu godziny na poszukiwaniu odpowiedzi, ten przykład sprawił, że wszystko stało się jasne i teraz mam to, co chcę pracować :) carbontwelve
9

musiałem dokonać wielu założeń, ponieważ twoje skrzypce nie były nawet poprawne javascript i wydawały się dość zdezorientowane i nawet nie odwołały się do nokautu

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)); ​

i skrzypce, które działają:http://jsfiddle.net/qeUHd/

Keith, co z tym jest nie tak. dlatego umieściłem to na skrzypcach, aby ludzie, którzy znają nokaut, poprawili to. W każdym razie dzięki Frenchi In LA
cóż, nie pokazałeś tego kodu ... zaktualizuj swoje pytanie, aby to pokazać. Keith Nicholas
Który kod? to jest odpowiedź madcapnmckay. Zasadniczo chciałbym wiedzieć, kiedy mapujesz model widoku na otrzymane dane, jak dodać do niego trochę obliczonych podstaw pól. Dzięki Frenchi In LA
Twoje skrzypce to śmieci :) to nie jest poprawne javascrtipt .... Keith Nicholas

Powiązane pytania