2013-08-01 11 views
5

Ich habe diese Daten JSON vom Server:Knockout-Mapping JSON Update vorhandene Ansicht Modell

{"HaveNotification":false,"IsError":false,"Title":null,"Description":null} 

und ich versuche, diese Ansicht Modell über ko.mapping zu füllen:

var notifyVM = { 
    HaveNotification: ko.observable(true), 
    IsError: ko.observable(false), 
    Title: ko.observable('Title goes here'), 
    Description: ko.observable('Description goes here'), 
} 

mit diesem Code , die auf einem Abfrageintervall genannt wird:

function pollNotifications() { 

    $.getJSON('@Url.Action("GetNotifications", "Home")', function (data) { 

    ko.mapping.fromJSON(data, notifyVM); 

    setTimeout(pollNotifications, 10000); 
    }); 
} 

und dies ist Seite zu laden Code:

$(function() { 

    ko.applyBindings(notifyVM); 

    setTimeout(pollNotifications, 10000); 
}); 

aber es funktioniert nicht. Wenn ich das Ansichtsmodell nach dem fromJSON-Aufruf überprüfe, werden die Observablen nicht aktualisiert, sie haben immer noch ihre Anfangswerte.

UPDATE: Einige weitere Informationen ... wenn ich dies tun in den pollNotifications funktionieren

var newVM = ko.mapping.fromJSON(data); 

Ich stelle fest, dass die Ansicht Modell erstellt es ist nicht das gleiche wie mein ein, es besteht aus einem einzigen beobachtbaren Funktion, während meine ist ein Objekt mit einer Reihe von beobachtbaren Eigenschaften.

+0

versuche ko.mapping.fromJS zu verwenden –

Antwort

0

Haben Sie versucht, die Werte manuell dem View-Modell zuzuordnen und zu sehen, ob das funktioniert, so?

function pollNotifications() { 
    $.getJSON('@Url.Action("GetNotifications", "Home")', function (data) { 
     notifyVM.HaveNotification(data.HaveNotification); 
     notifyVM.IsError(data.IsError); 
     notifyVM.Title(data.Title); 
     notifyVM.Description(data.Description); 

     setTimeout(pollNotifications, 10000); 
    }); 
} 

Wenn die oben nicht funktioniert, dann wissen Sie, es ein Problem mit Ihren Daten ist; Ansonsten passiert das Mapping nicht korrekt mit ko.mapping.fromJSON().

+0

Ja, das funktioniert, wenn ich die Werte manuell aktualisiere. Aber ich würde gerne wissen, warum die ko.mapping-Methode nicht funktioniert. Ich vermute, dass die JSON-Datenstruktur nicht mit meinem Ansichtsmodell übereinstimmt, aber ich kann nicht sehen, wo oder warum. – user380689

+0

Haben Sie 'ko.mapping.fromJS (data, notifyVM);' anstelle der Funktion 'fromJSON()' ausprobiert?Ich frage mich, ob die Funktion 'fromJSON()' die Disqualifizierung Ihrer Daten als JSON interpretiert. –

+0

Ja, habe das auch probiert, funktioniert aber immer noch nicht. – user380689

0

Sie sollten ko.mapping.fromJS anstelle von ko.mapping.fromJSON weil $ .getJSON wird ein Datenobjekt (kein json string) Rückkehr:

Der Erfolg Rückruf die zurückgegebenen Daten übergeben wird, Dies ist typischerweise ein JavaScript-Objekt oder -Array, wie es von der JSON-Struktur definiert und unter Verwendung der $ .parseJSON() -Methode analysiert wird. Es wird auch der Textstatus der Antwort übergeben.

http://api.jquery.com/jquery.getjson/

machen einen console.log (Daten); Um die Differenz

8

Versuchen:

ko.mapping.fromJS(data, {}, notifyVM);

Die beiden Parameter Form erwartet ein View-Modell, das zuvor mit ko.mapping.fromJS erstellt. Wenn es keine findet (basierend auf der Suche nach einer spezifischen Eigenschaft, die fromJS hinzufügt), wird davon ausgegangen, dass Sie das Formular fromJS (data, Optionen) aufrufen.

Die 3-Parameter-Form entfernt diese Mehrdeutigkeit.

+0

Wicked Whoot und da Bombe! Dieser rettete meinen Tag, danke! – Michel