2013-04-19 2 views
5

Il problema si verifica quando le opzioni selezionate non vengono aggiornate.Knockoutjs non aggiorna il valore quando si selezionano le opzioni modificate

Così, quando cambio Honda in Toyota, le opzioni nella seconda selezione sono cambiate correttamente, ma non è stato selezionato Mark. Devo aver perso qualcosa.

JavaScript:

function ViewModel() { 
    var self = this; 

    self.selectedMake = ko.observable() 
    self.selectedModel = ko.observable() 

    self.makes = ["Honda", "Toyota"]; 
    self.models = ko.computed(function() { 
     if (self.selectedMake() === "Honda") return ["CRV", "Accord"]; 
     if (self.selectedMake() === "Toyota") return ["Rav4", "Camry"]; 
     return []; 
    }); 
} 
$(function() { 
    ko.applyBindings(new ViewModel()); 
}); 

HTML:

<select data-bind="value: selectedMake, options: makes"></select> 
<select data-bind="value: selectedModel, options: models"></select> 
<p>Selected make: <b data-bind="text:selectedMake"></b></p> 
<p>Selected model: <b data-bind="text:selectedModel"></b></p> 

JS Fiddle: http://jsfiddle.net/apuchkov/n4VyD/

+0

Diventa strano quando si cambia fare, poi cambiare di nuovo. A quel punto, sta guardando il valore precedente dei modelli. –

+0

So che questo è un vecchio post. Il problema è stato risolto nell'ultima knockoutjs lib (3.2.0) [JSFiddle] (http://jsfiddle.net/n4VyD/93/) – pravin

risposta

2

io non so perché non funziona come è, ma se si imposta un abbonamento a modelli, è possibile modificare manualmente il modello selezionato.

function ViewModel() { 
    var self = this; 

    self.selectedMake = ko.observable() 
    self.selectedModel = ko.observable() 

    self.makes = ["Honda", "Toyota"]; 
    self.models = ko.computed(function() { 
     if (self.selectedMake() === "Honda") return ["CRV", "Accord"]; 
     if (self.selectedMake() === "Toyota") return ["Rav4", "Camry"]; 
     return []; 
    }); 

    self.models.subscribe(function(value) { 
     self.selectedModel(value[0]); 
    }); 
} 

$(function() { 
    ko.applyBindings(new ViewModel()); 
}); 

Fiddle

+0

Buona soluzione, grazie. Può essere anche semplificato in self.selectedModel (value); Ancora curioso cosa c'è di sbagliato con l'esempio originale. Se manca qualcosa o è un bug Knockout. –