2013-07-08 13 views
7

Pracuję na stronie internetowej, która aktualizuje wartości na stronie co 5 sekund, wywołuje zdalną bazę danych i zwraca model MVC przez wywołanie Get Json, i zadzwoń pod numerKnockout.js - ko.mapping.fromJS - Visible Binding nie aktualizuje

viewModel = ko.mapping.fromJS(model).

jestem następnie aktualizowania tego widoku modelu, co 5 sekund za pomocą innego połączenia GET i nazywają to wezwanie mapowania następnie

viewModel = ko.mapping.fromJS(model, viewModel). 

Wiązania są poprawne na moich elementów HTML w oryginalnym modelu, które są pobierane z bazy danych jest wyświetlane na ekranie, ale wtedy, gdy właściwość IsVisible w modelu nic się nie dzieje, tzn. wiersz tabeli powinien być ustawiony jako niewidoczny, a inny powinien być ustawiony jako widoczny.

Przy każdej aktualizacji model powinien być inny, z ustawionymi wierszami widocznymi lub niewidocznymi wraz z aktualizacją tekstów z innych zakresów, ta część działa, a aktualizacje są wyświetlane na stronie, tylko widoczność się nie zmienia.

HTML wyś wietla widoczny niewidoczny problem z JavaScriptem wywołania aktualizacji.

Wszystkie zmienne z modelu są poprawnie nazywane Nie mogę opublikować modelu dla publiczności.

<table class="SelectionTable" cellpadding="0" cellspacing="0"> 
    <tbody data-bind="foreach: { data: markets.Selections, as: 'selections' }"> 
     <tr class="Selection"> 
      <td><span data-bind='text: selections.Number, visible: selections.IsVisible'></span></td> 
      <td><span data-bind='text: selections.Name, visible: selections.IsVisible'></span></td> 
      <td><span data-bind='text: selections.CurrentPrice, visible: selections.IsVisible'></span></td> 
      <td><span data-bind='text: selections.OpeningPrice, visible: selections.IsVisible'></span></td> 
     </tr> 
    </tbody> 
</table> 

<script type="text/javascript"> 
    var viewModel; 
    var self; 

    var getUpdates = setInterval(function() { 
     $.getJSON(
      "/Home/Get", {}, 
      function (model) { 
       viewModel = ko.mapping.fromJS(model, viewModel); 
      }); 
    }, 5000); 

    $(document).ready(
     function() { 
      $.getJSON(
       "/Home/Get", {}, 
       function (model) { 
        viewModel = ko.mapping.fromJS(model); 
        bindViewModel(); 
       }); 
     }); 

    function bindViewModel() { 
     ko.applyBindings(viewModel); 
    } 
</script> 
+0

Czy mówisz, że widoczny kod nigdy nie działa, ani przy początkowym ładowaniu danych, ani w kolejnych aktualizacjach? –

+0

Niestety, wywołanie orginal działa i pokazuje poprawne wiersze, ale jest to kolejne wywołanie aktualizacji, które nie ukrywa aktualnie widocznych, ale teraz ustawione na niewidoczne wiersze lub pokazują ukryte, ale teraz ustawione na widoczne wiersze. –

Odpowiedz

2

Uważam, że czasami trzeba dostarczyć pusty mapowanie podczas aktualizowania ViewModel:

ko.mapping.fromJS(model, {}, viewModel); 

w przypadku jego braku, wyjście wartość selections.IsVisible i upewnij się, że jest w formacie, który można rozwiązać na true lub false.

+0

"Puste mapowanie" zadziałało dla mnie, pozostaje pytanie: dlaczego i kiedy? – Stefan

+0

wystarczy uruchomić ko.mapping.fromJS (model, {}, viewModel) bez ustawiania viewModel równego mu. Jest to nie tylko zbędne w tym przypadku, ale właśnie przekazanie viewModel jako trzeciego parametru. Pusta {} oznacza po prostu użycie pustego niestandardowego odwzorowania. – beauXjames

+0

Przepraszam, miałem na myśli, że nie rozumiem, dlaczego muszę czasami przekazać puste mapowanie, aby to działało. Masz rację, jeśli nie chcesz przypisać wyniku, aby zobaczyć model, ale go przegapiłeś! –