2012-10-25 19 views
6

Sto cercando di creare un'associazione personalizzata in knockout per usarla come campo di selezione multipla. Ad esempio: Desidero progettare la schermata di selezione per il report delle fatture. In questa schermata di selezione vorrei utilizzare il campo "Tipo di fattura" per consentire agli utenti di fornire solo i tipi di fatture, a cui sono interessati. Se utilizzo una casella di testo standard per questo campo, gli utenti possono solo fornire un tipo di fattura . Voglio che siano in grado di fornire più di un tipo nella selezione. La mia idea era quella di preparare un legame come ad esempio:Associazione personalizzata per selezione multipla in knockout js

// html 
<input data-bind="multiple: { data: optionsArray }" /> 
... 
// view model 
optionsArray = ko.observableArray(); 

dove ho potuto fornire campo 'optionsArray', tale da ostacolare la scelta multipla di utenti (nel mio caso che sarebbe più tipi di fattura). Se si tratta di interfaccia utente, ho pensato che potesse assomigliare a questo: c'è un pulsante accanto all'elemento con più rilegature. Dopo aver fatto clic su di esso, viene visualizzata la finestra di dialogo e tutti gli elementi 'optionsArray' sono visualizzati lì e possono essere modificati, nuovi possono essere aggiunti o cancellati.

Non so come ottenere ciò perché non sono riuscito a visualizzare tutti gli elementi OptionsArray nella finestra di dialogo in modo che possano essere modificati come osservabili e tutte le modifiche si riflettano in viewModel.optionsArray. È possibile?

Avete esperienza nella creazione di associazioni personalizzate e aiutatemi con questo?

risposta

5

Non è necessario creare custom binding per quello. È possibile utilizzare il collegamento selectedOptions qui è il collegamento alla documentazione: http://knockoutjs.com/documentation/selectedOptions-binding.html.

Aggiungere optionsArray e selectedTypes array osservabili al vostro modello di vista:

self.optionsArray = ko.observableArray(); 
self.selectedTypes = ko.observableArray(); 

e legarsi a multiselect:

<select data-bind="options: optionsArray, selectedOptions: selectedTypes" size="5" multiple="true"></select> 

Qui è esempio di lavoro con il dialogo e l'aggiunta di nuove opzioni: http://jsfiddle.net/vyshniakov/nZtZd/

+0

Questo è buono, ma selec L'elemento t non è così stylable e il più importante mi piacerebbe modificare ogni elemento sul posto. – Eori

+2

@Eori Cosa? L'elemento select è un elemento HTML nativo: può essere stilizzato dai CSS allo stesso livello di ogni altro elemento HTML. – Tyrsius

+0

La multi-selezione nativa è piuttosto orribile, ma lo styling ti porta solo lontano. Molte app hanno un elenco di elementi che possono essere aggiunti a un'area di testo. A volte ciò avviene con una multi-selezione nascosta per passare le selezioni al server. Questo è il tipo di cosa a cui dovrebbe eccellere knockout. –

0
ko.bindingHandlers.multiple = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     $(element).change(function() { 
      var actualValueArray = $(this).val().split(","); 
      valueAccessor(actualValueArray); 
     }); 
    }, 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var valueArray = valueAccessor(); 
     var valueArrayUnwrapped = ko.utils.unwrapObservable(value); 
     // Join all invoice numbers using comma 
     $(element).val(valueArrayUnwrapped.join(", ")) 
    } 
}; 
+0

Questo è solo prendendo tutti gli elementi dell'array e mostrandoli. Mi piacerebbe legare all'interno il multiplo legame di ogni elemento di matrice a un diverso elemento di input in modo che possano essere modificabili. – Eori

+0

In questo caso è sufficiente creare un modello non vincolante personalizzato come descritto in Esempio di griglia modificabile http://knockoutjs.com/examples/gridEditor.html – STO

+0

Ok, ma se ho 20 campi di questo tipo in una vista, questo è un sacco di codice. Sarebbe molto più ordinato e pulito averlo come vincolante. – Eori