2012-11-10 6 views
5

Voglio salvare il modello di vista nel campo nascosto in formato JSON. Tutto funziona bene.Impossibile analizzare i collegamenti js errore utilizzando ko.mapping.fromJSON con parse esistente vista modello

Ma quando cerco di farlo - ottengo l'errore:

Uncaught Error: Unable to parse bindings. Message: ReferenceError: selectAll is not defined; Bindings value: checked: AllCheck, click: selectAll

JsFiddler

ViewModel

function AppViewModel() { 

//Week 
this.AllCheck = ko.observable(false); 
this.DaysOfWeekResult = ko.observableArray(); 

this.selectAll = function() { 
    if (this.AllCheck()) { 
     viewModel.DaysOfWeekResult.removeAll(); 

     viewModel.DaysOfWeekResult.push("Mo"); 
     viewModel.DaysOfWeekResult.push("Tu"); 
     viewModel.DaysOfWeekResult.push("We"); 
     viewModel.DaysOfWeekResult.push("Th"); 
     viewModel.DaysOfWeekResult.push("Fr"); 
     viewModel.DaysOfWeekResult.push("Sa"); 
     viewModel.DaysOfWeekResult.push("Su"); 
    } 

    return true; 
}; 

    this.dayClicked = function() { 
    checkDays(); 
    return true; 
};   

}

codice Init

var viewModel;  
$().ready(function(){ 
     viewModel = new AppViewModel(); 
var viewModelDeserialized = ko.mapping.fromJSON(serializedJsonString, viewModel); 

     ko.applyBindings(viewModel); 
}); 


function checkDays() { 
    viewModel.AllCheck(viewModel.DaysOfWeekResult().length == 7); 
} 

modello è numerato

var serializedJsonString = '"AllCheck":false,"DaysOfWeekResult":[]}'; 

MarkUp

<div class="check-block"> 
       <input name="AllWeek" id="AllWeek" type="checkbox" value="AllWeek" data-bind="checked: AllCheck, click: selectAll" /> 
       <label for="AllWeek">All Week</label> 
      </div> 
      <div class="holder"> 
       <span> 
        <input name="Monday" id="Monday" type="checkbox" value="Mo" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Monday">Mo</label> 
       </span><span> 
        <input name="Tuesday" id="Tuesday" type="checkbox" value="Tu" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Tuesday">Tu</label> 
       </span><span> 
        <input name="Wednesday" id="Wednesday" type="checkbox" value="We" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Wednesday">We</label> 
       </span>    
       <span> 
        <input name="Thursday" id="Thursday" type="checkbox" value="Th" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Thursday">Th</label> 
       </span><span> 
        <input name="Friday" id="Friday" type="checkbox" value="Fr" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Friday">Fr</label> 
       </span><span> 
        <input name="Saturday" id="Saturday" type="checkbox" value="Sa" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Saturday">Sa</label> 
       </span><span> 
        <input name="Sunday" id="Sunday" type="checkbox" value="Su" data-day="true" data-bind="checked: DaysOfWeekResult, click: dayClicked" /> 
        <label for="Sunday">Su</label> 
       </span> 
      </div> 

risposta

15

Si sta chiamando il ko.mapping.fromJSON con argomenti sbagliati.

L'utilizzo corretto nel tuo caso è il seguente:

var viewModelDeserialized = 
    ko.mapping.fromJSON(serializedJsonString, {} /* empty options */, viewModel); 

Demo fiddle. (senza l'errore vincolante)

L'utilizzo del metodo ko.mapping.fromJSON è un po 'difficile:

  • puoi chiamarlo con un argomento: fornendo solo i dati es. var viewModel = ko.mapping.fromJSON(data) in questo caso verrà restituito il creato ViewModel

  • è possibile chiamare con due argomenti:

    • se il secondo argomento è una mappatura ko creato ViewModel allora è trattato come l'obiettivo di mapping ko.mapping.fromJSON(data, koMappingCreatedViewModel)
    • altrimenti il ​​secondo argomento è trattato come le opzioni di mappatura (questo accade nel tuo caso) var viewModel = ko.mapping.fromJSON(data, options)
  • si può chiamare con tre argomenti specificando esplicitamente i dati, la mappatura e di destinazione: ko.mapping.fromJSON(data, options, target)

+0

Grazie per la tua spiegazione Brilliant. –

Problemi correlati