2013-06-24 11 views
22

C'è un modo per mantenere l'associazione value all'oggetto, ma avere la proprietà optionsValue nell'oggetto. A partire da ora se si specificano entrambi, la proprietà optionsValue che viene selezionata popolerà l'associazione value. Id piace mantenere l'oggetto intatto nell'osservabile, ma specificare quale valore deve essere impostato nel valore della lista di selezione. In questo modo un modulo di invio invierà il optionsValue che ho scelto.knockout.js con opzioniValore e valore

@Html.DropDownListFor(q => q.DivisionId, new SelectList(Enumerable.Empty<string>()), new { data_bind="options: divisions, optionsText: 'Name', optionsValue: 'Id', value: division, optionsCaption: ' - '" }) 

function AddCrossPoolGameDialog() { 
    var self = this; 

    self.divisions = ko.observableArray([]); 
    self.division = ko.observable(); 

    self.awayDivisionTeams = ko.computed(function() { 
     var division = ko.utils.arrayFirst(self.divisions(), function(item) { 
      return self.division.Name() == item.Name; 
     }); 

     if (division) { 
      return division.DivisionTeamPools; 
     } 

     return []; 
    }); 
} 
+0

Sembra piuttosto semplice scrivere un'associazione per questo tipo di comportamento. Non so di un modo costruito. Un altro modo è quello di utilizzare semplicemente due proprietà diverse per il valore e l'invio. Un'altra domanda, se la proprietà non sta davvero osservando cambiata perché è una proprietà osservabile? –

+0

Alcuni altri menu a discesa dipendono da esso per mostrare/nascondere. –

+0

Non riesco davvero a capire la tua struttura, ti dispiacerebbe creare un campione molto ridotto del tuo problema su jsfiddle e postare il codice qui? –

risposta

24

Non è possibile ottenere sia i optionsValue e value attacchi per puntare a oggetti diversi, ma è possibile creare una soluzione semplice.

Per consentire al modulo di inviare un valore semplice, utilizzare optionsValue per indicare la proprietà dell'articolo associato che si desidera inviare con il modulo. Quindi assegnare il binding value a un osservabile. Infine, crea un computed per trovare e restituire automaticamente l'oggetto corretto quando il valore selezionato cambia.

binding Esempio:

<select data-bind="options: options, 
        optionsText: 'name', 
        optionsValue: 'id', 
        value: selectedOptionId"></select> 
<br/> 
<br/> 
Selection Option Object : <span data-bind="text: selectedOption"></span><br/> 
Selection Option name : <span data-bind="text: selectedOption().name"></span><br/> 
Selection Option id : <span data-bind="text: selectedOption().id"></span><br/> 

e vista modello:

var optionModel = function(id,name){ 
    var self = this; 
    self.id = id; 
    self.name = name; 
} 

var viewModel = function(){ 
    var self = this; 
    self.options = [ 
     new optionModel(1,"First"), 
     new optionModel(2,"Second") 
    ]; 
    self.selectedOptionId = ko.observable(self.options[0].id); 
    self.selectedOption = ko.computed(function(){ 
     return ko.utils.arrayFirst(self.options, function(item){ 
      return item.id === self.selectedOptionId(); 
     }); 
    }); 
} 

ko.applyBindings(new viewModel()); 

I've posted this to a jsFiddle here.

Spero che questo aiuti!

+1

che p.i.t.a è per farlo funzionare per la validazione globale dei moduli, grazie! –

+0

Il mantenimento del codice KO è un incubo, perché il mio passato non ha usato altro - oh aspetta, il Po (S) C doveva essere eseguito in IE8 ... – mfeineis

Problemi correlati