2011-08-13 24 views
8

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?

+1

Neden bir HtmlHelper uzantısı yöntemi oluşturmuyorsunuz? Genel bir argüman alın ve kodlanmış çıktıyı döndürün. – Anuj

+0

@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. –

cevap

15

Genellikle diziyi önce serileştiririm, sonra da onu görünüm modeline yerleştirirken eşlerim.

var originalVarieties = @Html.Raw(Json.Encode(ViewBag.Materials)) 

var processViewModel = { 
    materialVarieties: ko.observableArray(ko.utils.arrayMap(originalVarieties, function(variety) { 
     return new material(variety.id, variety.name); 
    })) 
} 

istemci tarafında ek işlemler çok az miktarda gerektirir, ancak dizeleri bina daha temiz görünüyor: gibi olurdu.

+0

ah, bu iyi görünüyor. Knockout'ta yeniyim ve utils.arrayMap'tan habersizdim. Teşekkür ederim. –

+0

sadece jQuery haritasının yanı sıra ... –

+2

evet, ko.utils.arrayMap hakkında özel bir şey yoktur. Oldukça basit bir kod. jQuery haritası aynı şeyi yapardı. –

İlgili konular