2013-07-08 1 views
7

Sto lavorando a un sito Web che aggiorna i valori sulla pagina ogni 5 secondi, chiama a un database remoto e restituisce un modello MVC tramite una chiamata Get Json, e chiamaKnockout.js - ko.mapping.fromJS - Visible Binding non si aggiorna

viewModel = ko.mapping.fromJS(model).

Sto quindi l'aggiornamento di questo modello di vista ogni 5 secondi con un'altra chiamata Get e chiamare questa chiamata mappatura poi

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

Gli attacchi sono corrette sui miei elementi HTML come il modello originale che viene recuperato dal database è visualizzato sullo schermo, ma quando la proprietà IsVisible sul modello non accade nulla, cioè la riga della tabella deve essere impostata su invisibile e un'altra deve essere impostata su visible.

Ad ogni aggiornamento il modello deve essere diverso, con le righe impostate come visibili o invisibili insieme all'aggiornamento del testo di altri span, questa parte funziona e gli aggiornamenti vengono visualizzati sulla pagina, solo la visibilità non cambia.

Esercitazione HTML del problema invisibile visibile, con Javascript della chiamata di aggiornamento.

Tutte le variabili del modello sono correttamente chiamate Impossibile pubblicare il modello per il pubblico.

<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

Stai dicendo che il codice visibile non funziona mai, né sul caricamento iniziale dei dati né sugli aggiornamenti successivi? –

+0

Spiacente, la chiamata originale funziona e mostra le righe corrette, ma è il successivo aggiornamento chiama che non nasconde il visibile attualmente ma ora è impostato su righe invisibili, o mostra l'originale nascosto, ma ora è impostato su righe visibili. –

risposta

2

trovo che a volte è necessario per fornire una mappatura vuoto quando si aggiorna un ViewModel:

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

In mancanza di ciò, in uscita il valore di selections.IsVisible e assicurarsi che sia in un formato che può risolvere a vero o falso.

+0

"mapping vuoto" ha funzionato per me, la domanda rimane: perché o quando? – Stefan

+0

esegui semplicemente ko.mapping.fromJS (model, {}, viewModel) senza impostare viewModel uguale ad esso. Non solo è ridondante in questo caso, ma passare viewModel come terzo parametro fa proprio questo. Il {} vuoto significa semplicemente utilizzare una mappatura personalizzata vuota. – beauXjames

+0

Scusate, volevo dire che non ho capito perché a volte devo passare in una mappatura vuota per farlo funzionare. Hai ragione sul non aver bisogno di assegnare il risultato per vedere il modello, ma lo hai perso! –