Frage an knockout.js, knockout-mapping-plugin – Knockout-Mapping mit berechneten Feldern

5

Ich erhalte Daten von einem WCF-Dienst und ordne sie meinem DOM-Objekt zu:

var PayinyVM = {};

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

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

Das Ergebnis wird in meinem DOM als "Ausgenommen" angezeigt. Binde es an das Modell. Was ich nicht herausfinden konnte, ist, wie man einige berechnete beobachtbare Elemente hinzufügt. Angenommen, meine Daten geben Personen mit Vor- und Nachnamen zurück. Wie kann ich einen berechneten beobachtbaren vollständigen Namen mit FN + '' + LN erstellen.

Deine Antwort

3   die antwort
2

Es stellte sich heraus, dass ich alle Eigenschaften des Ansichtsmodells in Javascript definieren muss, damit Knockout das Ansichtsmodell mit Eigenschaften initialisieren kann, bevor ich es mit Serverdaten aktualisiere

Referenz:http://www.underwatergorilladome.com/how-to-use-knockout-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);
                }));
            }
        }
    )
};
Nachdem ich eine Stunde nach der Antwort gesucht hatte, machte dieses Beispiel alles klar und ich habe jetzt das, was ich arbeiten möchte :) carbontwelve
4

Sie können die Zuordnung umkehren, indem Sie ein Modellobjekt erstellen, das intern zugeordnet ist.

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

Hoffe das hilft.

Ich glaube, das ist die funktionierende Geige ...jsfiddle.net/grimreaper01/caKrR Vyache
Vielen Dank für Ihre Hilfe, aber es funktioniert nicht für mich. Ich habe MyModel in PayingVM geändert und parse (data) nach parse (tmp). Trotzdem erhalte ich einen Fehler. "self.FirstName ist keine Funktion innerhalb der berechneten Funktion. Jede andere Korrektur. Hier ist mein neuer Code Frenchi In LA
jsfiddle.net/nYF67 Ich habe gerade Daten hinzugefügt, wie ich sie von WCF erhalte. Bitte sehen Sie sie sich an und lassen Sie mich wissen, was mir fehlt. Vielen Dank Frenchi In LA
Ein paar Probleme mit deiner Geige. Die Daten sind ungültig. Übergeben Sie es an JSONLint und sehen Sie. Fehlender Knockout in den Ressourcen. Sie haben auf eine Modelleigenschaft hingewiesen, die nicht vorhanden ist. So sollte es sein.jsfiddle.net/madcapnmckay/nWTMf/3 Wenn Sie ein Array von Objekten erwarten, sollte es als {arrayName: [..]} empfangen werden, dann ist Ihr foreach auf arrayName. madcapnmckay
9

Hier ist eine Arbeitskopie Ihrer Geige. Ich musste viele Annahmen treffen, da Ihre Geige nicht einmal korrektes Javascript war und ziemlich verwirrt wirkte und sich nicht einmal auf Knockout bezog

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

und eine Geige, die funktioniert:http://jsfiddle.net/qeUHd/

Welcher Code? Es ist eine verrückte Antwort. Grundsätzlich würde ich gerne wissen, wann Sie ein Ansichtsmodell den empfangenen Daten zuordnen, um einige berechnete Felder als Basis hinzuzufügen. Vielen Dank Frenchi In LA
Alle Probleme gehen anchat.stackoverflow.com/rooms/12181/knockoutjs Keith Nicholas
Keith, was ist los damit? Deshalb habe ich es für Leute, die Knockout kennen, in Ordnung gebracht, um es zu korrigieren. Danke trotzdem Frenchi In LA
Ich hatte es schon einmal versucht und PayinyVM zu bekommen.Name ist keine Funktion. In meinem Programm versuche ich tatsächlich, dem Namen etwas hinzuzufügen. Danke trotzdem. Es gibt Version injsfiddle.net/nYF67 Frenchi In LA

Verwandte Fragen