2012-10-25 29 views
6

Birden fazla seçim alanı olarak kullanmak için nakavt sırasında özel cilt oluşturmaya çalışıyorum. Örneğin: Fatura raporu için seçim ekranı tasarlamak istiyorum. Bu seçim ekranında, kullanıcıların yalnızca fatura türlerini sağlamaları için ilgilenen 'Fatura Türü' alanını kullanmak istiyorum. Bu alan için standart metin kutusu kullanırsam, kullanıcılara yalnızca bir fatura türü sağlanabilir . Seçimde birden fazla tür sağlayabilmelerini istiyorum. Benim fikrim hazırlamaktı bağlayıcı bir örneğin: Ben alanını sağlayabilirNakavt js içinde çoklu seçim için özel ciltleme

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

'optionsArray', (çoklu fatura türleri olurdu benim durumumda) kullanıcıların çoklu bir seçeneği yapacağını. Kullanıcı arayüzüne gelirse, bunun böyle görünebileceğini düşündüm: Birden çok ciltlemeyle öğenin yanında bir düğme var. Tıkladıktan sonra, diyalog penceresi görünür ve tüm 'optionsArray' öğeleri orada görüntülenir ve değiştirilebilir, yeni eklenebilir veya silinebilir.

Bunu nasıl başaracağımı bilmiyorum çünkü iletişim kutusundaki tüm optionsArray öğelerini, gözlenebilirler olarak düzenlenebilir bir şekilde başarısız oldu ve tüm değişiklikler viewModel.optionsArray öğesinde yansıtıldı. Bu mümkün mü?

Özel bağlamalar oluşturma konusunda herhangi bir deneyiminiz var mı?

cevap

5

Bunun için custom binding oluşturmanız gerekmez. selectedOptions bağlayıcısını kullanabilirsiniz, burada belge: http://knockoutjs.com/documentation/selectedOptions-binding.html. iletişim ile örnek çalışma ve yeni seçenekler ekliyor İşte

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

: http://jsfiddle.net/vyshniakov/nZtZd/

+0

Bu iyi, ancak seçilebilir t elemanı bu kadar zor değil ve en önemlisi her bir öğeyi yerinde düzenlemek istiyorum. – Eori

+2

@Eori Ne? Seçici eleman, yerel bir HTML öğesidir: CSS tarafından diğer HTML öğeleriyle aynı seviyeye kadar biçimlendirilebilir. – Tyrsius

+0

Yerel çoklu seçim oldukça korkunç olsa da, stil yalnızca size ulaşıyor. Birçok uygulamanın, bir metin alanına eklenebilecek öğelerin bir listesi vardır. Bazen bu, seçimleri sunucuya aktarmak için gizli bir çoklu seçim ile yapılır. Bu, nakavt etmesi gereken bir şey. –

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(", ")) 
    } 
}; 
multiselect için

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

Ve bağlamak:

görünümünüzü modeline optionsArray ve selectedTypes gözlemlenebilir diziler ekle

+0

Bu, tüm dizi öğelerini alıp bunları görüntülüyor. Her dizi elemanının farklı bir giriş elemanına çoklu bağlanmasını sağlamak ve böylece düzenlenebilir hale gelmek istiyorum. – Eori

+0

Bu durumda, Düzenlenebilir Kılavuz örneğinde anlatıldığı gibi özel ciltleme şablonu oluşturmayın. Http://knockoutjs.com/examples/gridEditor.html – STO

+0

Tamam, ancak bir görünümde 20 tane alanım varsa, bu çok fazla kod. Bir bağlayıcı olarak sahip olmak çok daha temiz ve daha temiz olurdu. – Eori