2016-03-25 8 views
0

Ich habe Radio-Schaltflächen, die beobachtbar sind und je nach Wert ich möchte eine GETJSON-Methode, um meine Daten zurück und dann zu einem beobachtbaren Array, dass ich als eine Liste angezeigt wird, auslösen. Der Fehler, den ich erhalte, ist Kann Property 'push' von undefined nicht lesen. Hier ist meine FiddlePush JSON zu knockout beobachtbaren Array

Wie bekomme ich diese Daten zu meinem beobachtbaren Array, nachdem das Optionsfeld angeklickt wurde, die getjson Methode auslösend?

self.currentAnswer = ko.observable(); 
    self.recipientList = ko.observableArray([]); 
self.currentAnswer.subscribe(function (newValue) { 
    if (newValue == 'Internal') { 
     $.getJSON('GetInfo', function (data) { 
      var result = $.parseJSON(data); 

      self.recipientList.push(result); 


     }); 
+1

Ich habe die Geige aktualisiert (https://jsfiddle.net/jsw1ezut/7/). Löst es deine Aufgabe? – TSV

+0

Das hat mir geholfen, es zu lösen. https://jsfiddle.net/Domt301/c54x6d14/ –

Antwort

1

Aktivitäten rufen zu berücksichtigen:

  • $.getJSON() die JSON für Sie analysieren, die Sie nie, dass selbst tun müssen. Dies gilt auch für $.get(). (*)
  • Knockout Observables sind Funktionen. Sie können sie als Rückrufe verwenden. (**)

Mit diesem Wissen:

self.recipientList = ko.observableArray(); 
self.currentAnswer = ko.observable(); 
self.currentAnswer.subscribe(function (newValue) { 
    if (newValue == 'Internal') { 
     $.get('GetInfo').done(self.recipientList); 
    } 
}); 

(*) Wenn Sie in Ihren Erfolg Rückruf nicht geparsten JSON erhalten, fixieren Sie die Content-Type Header Ihrer Antwort .

(**) Wenn Sie eine Observable aufrufen und einen Wert als erstes Argument übergeben, wird dieser Wert gespeichert. Zufällig ruft jQuery Ajax-Erfolgsrückrufe auf und übergibt den zurückgegebenen Wert als ersten Parameter. Passt perfekt.

+0

War nicht bewusst, sehr ordentlich! –

+1

Vergleichen Sie diese Geige mit ein paar Verbesserungen (und eine tatsächliche Ajax Anfrage): https://jsfiddle.net/jsw1ezut/11/ – Tomalak

+0

das ist cool mit dem Ajax Anruf, ich bin nicht vertraut mit der Verwendung von Parametern. Letztendlich versuche ich auch, einen Textbereich mit den JSON-Daten zu laden, die in das beobachtbare Array der Elemente verschoben wurden, und es so auswählbar zu machen, dass es zurück zum Server gesendet wird. Danke für diese tolle Antwort! –

1

Ich habe Ihre Fiddle aktualisiert, so dass es funktioniert. Grundsätzlich müssen Sie self.recipientList.push.apply(self.recipientList, result);

https://jsfiddle.net/jsw1ezut/9/

+0

Dies funktioniert, aber es drängt in die Empfängerliste Array, ich versuche, es in die Elemente-Array zu bekommen. –

+0

@Leonardo In Ihrem Beispielcode ist kein Elementarray vorhanden. – Tomalak

+0

Ich habe ein Update basierend auf @TSV Kommentar früher gemacht. https://jsfiddle.net/Domt301/c54x6d14/ –

Verwandte Themen