kullanarak sunucu verilerinden başlatılabilir bir diziyi başlatıyor Bazı sunucu verilerinden (ViewBag) devre dışı bırakılabilir bir dizi başlatmanın en iyi yolunu arıyorum ve dizi içeriğinin bir javascript türünde olmasını istiyorum. tanımladı. Fazladan ViewModel belirli özelliklere sahip olabilir ve işlevleri yaniKnockout JS, javascript tipi
materialVarieties: ko.observableArray(@Html.Raw(Json.Encode(ViewBag.Materials)))
ama ben de bu yüzden kullanmak istediğiniz bir malzeme JS türü var:
var material = function(id, name) {
this.id = id;
this.name = name;
this.selected = ko.observable(false);
this.select = function()
{
jQuery.each(processViewModel.materials(), function(index, item)
{
item.selected(false);
});
this.selected(true);
}
}
JS tip gereksinimi olmadan ben sadece kullanabilirsiniz
sonra gerekli başlatma dönüşür:
materialVarieties: ko.observableArray([new material(1, "Apricot"), .....
Şu anda ViewBag verilerinden bir dize oluşturmak ve sonra böyle başlatıcısı olarak o işlemek:
@{ var items = string.Join(",",
((IEnumerable<MaterialVariety>) ViewBag.Materials)
.Select(m => string.Format("new material({0}, {1})",
Json.Encode(m.Id), Json.Encode(m.Name)))); }
var processViewModel = {
material: ko.observableArray([@Html.Raw(items)])
Ancak, string.Join
bitinden daha temiz bir yol olup olmadığını merak ediyorum. Bir Yardımcıya sarılabilirim. Ne yaparsın?
Neden bir HtmlHelper uzantısı yöntemi oluşturmuyorsunuz? Genel bir argüman alın ve kodlanmış çıktıyı döndürün. – Anuj
@Anuj Evet, düşündüğüm şey şu ki ('Bir Yardımcıya sarılabilirim'), JS türünü temsil eden bir dizgenin de olması gerekir. JS kurucuda kullanılacak özellikleri (ve gereken sipariş) çalışırken sorun geliyor. Özellikleri almak için genel argümanı yansıtabilirim, ancak sunucu tarafımdaki Modellerimi kullanmamayı umuyordum (sunucu tarafındaki VM'lerin başka bir setini istemiyorum) ve JS'mde ihtiyaç duymadığım başka özelliklere sahipler. Ve bu hala bana bir şeyleri kaçırmadığı sürece kurucu arg sırası problemini bırakıyor. –