2012-03-21 13 views
6

Właśnie zacząłem używać knockout.js i działa dobrze z normalnymi licytacjami. Mam problem z obserwowalną tablicą.Utwórz ko.observableArray z obiektu JSON w nokaucie

Chcę utworzyć observableArray i przypisać mu dane JSON z interfejsu API kanału Google. Tutaj jest format JSON https://developers.google.com/feed/v1/devguide#resultJson

google.load("feeds", "1"); // Loads Google Feed API 
function FeedViewModel() 
{ 
    // Data 
    var self = this; 
    self.allEntries = null; 

    // Example property, and it works 
    self.feedHead = ko.observable("BBC News"); 

    var feed = new google.feeds.Feed("feeds.feedburner.com/BBCNews"); 
    feed.setResultFormat(google.feeds.Feed.JSON_FORMAT); 
    feed.includeHistoricalEntries(); 
    feed.setNumEntries(30); 

    // Loads feed results 
    feed.load(function (result) { 
     if (!result.error) {   
      self.allEntries = ko.observableArray(result.feed.entries); 

      // accessing the title from here is OK 
      alert(self.allEntries()[1].title); 
     }   
    }); 
} 

W powyższym przykładzie, dostęp do tablicy z ViewModel jest OK, ale muszę go wyświetlić w widoku (w przeglądarce), używając foreach: allEntries

<h2 data-bind="text: feedHead">Latest News</h2> 
<!-- ko foreach:allEntries --> 
    <div class="lists"> 
     <a href="#" data-bind="text: title"></a> 
    </div> 
<!-- /ko --> 

Ale nic, pętla Ko foreach nic nie zwraca. Obserwowalny feedHead jest OK.

Również nie mam żadnego błędu JS. Każda pomoc ..

+0

całkiem pewny, trzeba utworzyć tablicę z góry, a następnie w twoim ładunku wypełnisz tę tablicę ...... –

Odpowiedz

22

Spróbuj deklarowania (gdzie masz dane //)

self.allEntries = ko.observableArray([]); 

następnie w obciążeniu ...

self.allEntries(result.feed.entries); 
+0

Dzięki Keith, działa dobrze. – Maxali

+2

Hej Maxali, czy możesz umieścić wszystko działające w JSFIDDLE? Bardzo podoba mi się działający przykład renderowania kanału. To może okazać się pomocne dla mnie. Dziękujemy –

+0

+1 za rozwiązanie. Zaskoczony, że ta odpowiedź nie miała jeszcze 10 głosów, ponieważ jest to jedno z tych pytań/odpowiedzi, które mnóstwo ludzi będzie pytać, gdy użyje Knockout! : D –