2011-07-11 25 views
32

Bir açılır menünün başlangıç ​​değerini belirleyerek küçük bir sorun yaşıyorum. Aşağıdaki kod, $(document).ready numaralı görünüm modelinin tanımı ve başlatılmasıdır. Bu dizinin seçili değerini temsil eden sourceMaterialTypes ve selectedSourceMaterialType adında bir dizim var. Görünüm modelini (ASP.Net MVC) Model ve ViewBag değerleriyle başlatıyorum. AşağıdakiBaşlangıç ​​/ varsayılan değeri açılır listesinin bağlanması (seçenek)

var viewModel = { 
    sourceMaterialTypes : 
     ko.observableArray(@Html.Raw(Json.Encode(ViewBag.SourceMaterialTypes))), 
    selectedSourceMaterialType : 
     ko.observable(@Html.Raw(Json.Encode(Model.SourceMaterialType))), 
    ingredientTypes : 
     ko.observableArray(@Html.Raw(Json.Encode(ViewBag.IngredientTypes))), 
    selectedIngredientType : ko.observable() 
}; 

$(document).ready(function() { 

    ko.applyBindings(viewModel); 

    viewModel.selectedSourceMaterialType.subscribe(function(newSourceMaterialType) { 
     $.getJSON("/IngredientType/FindByMaterialType", 
        { "id": newSourceMaterialType }) 
      .success(function (data) { 
       viewModel.ingredientTypes($.parseJSON(data)); 
      }) 
      .error(function() { alert("error"); }); 
    }); 
}); 

benim açılır (seç) Nakavt bağlayıcı tanımıyla listenin tanımıdır.

<select id="SourceMaterialTypeId" 
     name="SourceMaterialTypeId" 
     data-bind="options: sourceMaterialTypes, 
        optionsText: 'Name', 
        optionsValue : 'Id', 
        value: selectedSourceMaterialType"></select> 

Bu, tüm (selectedSourceMaterialType doğru bağlıdır açılan seçim değeri doğru güncellenir değiştiğinde bu yüzden, ben bir sorun yaşıyorum sadece ilk seçim olan kaynak malzemeleri açılan başlangıçta seçilen değerin dışında çalışıyor ile), her zaman görünüm modelimde sourceMaterialTypes dizisindeki ilk öğedir.

Başlangıçta seçilen değerin, (sunucu tarafı) modelinden selectedSourceMaterialType görünüm modeli özelliğinin değeri olarak başlatılan değer olmasını isterim.

+0

bu iyi çalışıyor olmalı; oluşturulan html kaynağını kontrol edin ve> 'selectedSourceMaterialType: ko.observable (@ Html.Raw (Json.Encode (Model.SourceMaterialType))) 'dan neyin oluşturulduğunu görün boş bir parametre olduğundan şüpheleniyorum. – neebz

+0

@nEEbz hayır, boş değil .... 'selectedSourceMaterialType: ko.observable ({" Id ": 2," Name ":" Fruit "," Açıklama ":" Fresh Fruit "," MeasuredIn ": 1," MeasuredInValue ": 1}),' ne işlenir, ancak ilk seçim sourceMaterialTypes içinde sourcematerialTypes: ko.observableArray ([{"Id": 1, "Name": " Kahve Çekirdeği "," Açıklama ":" Çiğ kahve çekirdekleri "," ÖlçülenIn ": 0," Ölçülen Değer ": 0}, {" Kimlik ": 2," İsim ":" Meyve "," Tanımlama ":" ‌ Taze Fruit "," MeasuredIn ": 1," MeasuredInValue ": 1}])', (ilk seçim "Kahve Çekirdeği" dir) –

+3

Sanırım yalnızca kimliği değil, selectedSourceMaterialType gözlemlenebilir işlevindeki tüm nesneyi geçmeniz gerekir - > 'selectedSourceMaterialType: ko.observable (2)' – neebz

cevap

12

Sana selectedSourceMaterialType gözlemlenebilir fonksiyonunda değil, yalnızca bütün nesne kimliği geçmesi gerekiyor sanırım - @nEEBz önerildiği gibi>

selectedSourceMaterialType: ko.observable(@Model.SourceMaterialType.Id) 
+11

Ancak, tüm nesneyi sağlamak ve optionsValue: 'Id' özelliğini kullanmamak için nasıl yapılacağını bilen var mı? – pilavdzice

4

API sizin için bir çözüm sunuyor, seçimlerinize optionsCaption eklemeniz gerekecek.

<select id="SourceMaterialTypeId" 
    name="SourceMaterialTypeId" 
    data-bind="options: sourceMaterialTypes, 
       optionsText: 'Name', 
       optionsValue : 'Id', 
       value: selectedSourceMaterialType, 
       optionsCaption: 'Please select...'"></select> 
+10

Sorunun başlangıç ​​/ varsayılan değerinin model/görünüm modeli tarafından ayarlanmış olması gerektiğine odaklandığına inanıyorum. Öyleyse, öğeyi düzenlediyseniz, son seçili değerin gösterilmesini istersiniz, "Lütfen seçin ..." – peteski

+0

İpucu: 'optionsCaption 'gözlenebilir bir durumdur.eğer null döndürürse o zaman öğe seçenekler listesinde bulunmaz - böylece bunu yapabilirsiniz 'monthCaption = ko.computed (() => this.nextShipmentDate_month()? null: '- Ay Seç -'); '(buradaki yazı tipini varsayarak) –

1

, selectedSourceMaterialType yanlış başlatılır. learn.knockoutjs.com "Lists and Collections" tutorial'da, gözlemlenebilir dizinin belirli bir dizininin değerini geçerek, görünüm modellerinin seçili öğe özelliğini başlatırlar. Örneğin, bu yapın:

selectedSourceMaterialType: ko.observable(sourceMaterialTypes[2]) 

... bunun yerine:

selectedSourceMaterialType: ko.observable({"Id":1,"Name":"Coffee Bean" /* ... */}); 

Bu şekilde, seçilen öğenin değerini dropdownlist aynı gözlemlenebilir dizide öğeye referanstır öğeler gelir.

+1

Sanırım böyle yapıyorlar mı? Bu, seçilmesi gereken öğenin endeksini belirlemek için sunucudan geri gelen sonuçların fazladan işlenmesini gerektirir. –

İlgili konular