2012-11-16 19 views
15

Arabirimi dinamik olarak oluşturmak ve dinamik olarak oluşturulmuş öğelere veri eklemek istediğim hızlı bir prototip oluşturma aracı üzerinde çalışıyorum. vmSchema olarak türlerine göre arayüz öğeleri oluşturmak için kullanılacak ve sonra vmData bu elementlere databind ediyorumKnockoutjs program arabirimi oluşturulmuş arabirime bağlanıyor

var viewModel = { 
    vmSchema: { 
      "Id" : "int", 
      "Name" : "string", 
      "UpdatedOn" : "date" 
    }, 
    vmData: { 
      "Id": "123" 
      "Name" : "Bob", 
      "UpdatedOn" : "2012-11-16T00:00:00" 
    } 
} 

: ViewModel gibi görünecektir.

Arabirim oluşturmak hiç sorun değil. Buradaki zorluk, programlanan arayüze vmData mdoel'in programlanmasıdır.

Bu tür programatik veritabanlarına izin verecek araçlar veya teknikler var mı?

cevap

31

Modelinizin alanlarının ve türlerinin çalışma zamanına kadar bilinmeyeceği anlaşılıyor. Bu tür dinamik olarak oluşturulmuş bir model için, özelliklerini iki yönlü bağlamaya gerek olduğunu varsayarak, özelliklerini gözlenebilirlere dönüştüren bir kod yazmanız gerekir. En temel, sen vmData boyunca yineleme olabilir ve bir ko.observable içine onun içinde her şeyi çevirmek:

for (var member in viewModel.vmData) { 
    if (viewModel.vmData.hasOwnProperty(member)) { 
     viewModel.vmData[member] = ko.observable(viewModel.vmData[member]); 
    } 
} 

bağlayıcı görünümüne gelince, "arayüz öğelerini oluştururken" ne bağlıdır. Oluşturma zamanında HTML öğelerine data-bind öznitelikleri ekleyebilirlerse, her şey basit olmalıdır: Arabirim oluşturulur ve DOM'a eklenir yüklenmez yalnızca ko.applyBindings çalıştırın. Herhangi bir nedenle, data-bind süslemelerini ekleyemezseniz, biraz belgesiz ko.applyBindingsToNode'u kullanarak bağlantıları manuel olarak belirtebilirsiniz.

// manually specify a binding for an element 
var elm = document.getElementById('some_elm'); 
ko.applyBindingsToNode(elm, { value: viewModel.vmData.id}, viewModel.vmData); 

Yukarıdaki değer <span class="some_elm" data-bind="value: vmData.id"></span> ile eşdeğerdir.

+0

VmSchema boyunca ve türüne bağlı koşullu şablonlar kullanarak, UI oluşturmak için nakavt kullanacağım. Hile daha sonra program aracılığıyla vmData'ya bağlanır. – dcpar

+1

Bunun için teşekkürler! Özel bir bağlayıcı işleyici içinde yerleşik bir bağlantı kurmak için gerekli olan sadece budur! – rossisdead

+1

+1 Teşekkürler! Pes etmek üzereydim, ama sonra bu yazıyı buldum. – Laith