2015-03-16 18 views
6

Ben özelliklere göre bir "ürün" seçim yapmak niyetiyle, nakavt seçer bağlıydı yapmaya çalışıyorumknockout.js bağımlı değişken örneğin bir ürünün için,

[altındaki güncellemelerini bakınız] seçer "boyut" ve "malzeme" olabilir, "boyut" seçtiysem, bir nakavt betiği arka tarafa bir istek yapar ve seçili boyut için hangi "malzeme" nin kullanılabilir olduğunu, başka bir deyişle bir özellik seçildiyse, diğer öznitelikleri sadece mevcut değerleri göstermek için filtrelenir ("tüm boyutlar": 1,2,3,4,5; "alüminyum": 1,4).

Özellikler listesi tamamen dinamiktir, ürünlere isteğe bağlı olarak bağlanabilecek yaklaşık 80 özellik vardır.

Bu durum için "en iyi uygulamalar" var mı?

Henüz başarılı olamadı, böyle koduyla çözmeye çalışıyorum:

var ViewModel = function(data) { 
    var self = this; 
    self.data = data; 
    self.attributes = ko.observableArray(); 
    self.data.forEach(function(item, i, a) { 
     // I passed .self to catch it later 
     // in products as view_model.attributes(). 
     self.attributes.push(new VariableProduct(item, self)); 
    }) 
}; 

var VariableProduct = function(item, view_model) { 
    var self = this; 
    self.attribute_name = ko.observable(item.name); 
    self.attribute_value = ko.observable('--'); 

    // list of attribute values 
    self.attribute_values = ko.computed(function() { 
     var result = {}; 
     view_model.attributes().forEach(function(attribute, i, a) { 
      // here I try to filter each attributes lists by values 
      // it doesn't work well 
      if (attribute.attribute_name() != self.attribute_name() && self.attribute_value() != '--') { 
       result = attribute.attribute_values().filter(
         function(value) { 
          return value.indexOf(self.attribute_value()) >= 0; 
         }); 
      } 
     }); 
     return result; 
    }); 
}; 

GÜNCELLEME 1:) (ko.subscribe için Dnyanesh en atıfla i bu sonuçları achived ettik değilmi 't Tamam henüz değil ama bir ilerleme:

http://jsfiddle.net/xwild/65eq14p3/

GÜNCELLEME 2: o solv oldu sonunda knockout.reactor ve knockout.mapping eklentileri ile ed. Detaylar ve cevap ile birlikte

Related stackoverflow question. bağımlı İçin

+0

İlginç bir soru, bunun tersi de işe yaramalı mı? Örneğin, malzemeyi seçerseniz, yalnızca kullanılabilir boyutlar boyut açılır menüsünde filtrelenmelidir? Ya da hepsi 1 açılana (boyutlara) bağlı "öznitelikleri" dir .. başka bir deyişle: "boyutlar" tek bağımsız değişken, ve diğerleri bağımlı ya da tüm öznitelikleri birbirine bağımlı mıdır? – Tyblitz

+0

Evet, her ürün için yaklaşık 10-15 filtre yerleştirilir ve diğer seçimler değiştirildiğinde her seçim tepki vermelidir. – xwild

+0

Gerçek koddan bahsetmeden, tasarım hakkında tam olarak düşünmenin yararlı olabileceğini düşünüyorum. Çıktınızın http://us.acer.com/ac/en/US/content/models/laptops gibi bir şey olması gerektiğini varsayalım (devam edin ve bazı kutuları kontrol edin); ve seçilemediğinde seçenekleri tamamen çıkarmanın akıllıca olduğunu düşünmüyorum. Daha ziyade, ziyaretçiye, kararının onay kutularını devre dışı bırakarak/onları vurarak (bağlantıya bakın) kararını sınırlandırdığını açıkça belirtin. Kısacası, 'select' – Tyblitz

cevap

2

Sana şekilde

var vm = { 
 
     sizes: ko.observableArray([ 
 
      { name: 'size 1', id: 1}, 
 
      { name: 'size 2', id: 2}, 
 
      { name: 'size 3', id: 3}, 
 
      { name: 'size 4', id: 4} 
 
     ]), 
 
     selectedSize : ko.observable(0), 
 
    
 
    }; 
 
     
 
      vm.selectedSize.subscribe(function(newValue){ 
 
       alert('Selected Size is ---> ' + newValue) 
 
      // Here at this point call your ajax or backend method and bind the values which are coming form 
 
     }); 
 
     
 
    ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.0.0/knockout-min.js"></script> 
 
<select data-bind=" 
 
    options: sizes, 
 
    optionsText: 'name', 
 
    optionsValue: 'id', 
 
    value: selectedSize, 
 
    optionsCaption: 'Choose Size...'""> 
 
</select> 
 
    
 
<select data-bind=" 
 
    options: material, 
 
    optionsText: 'name', 
 
    optionsValue: 'id', 
 
    value: selectedMaterial, 
 
    optionsCaption: 'Choose Material...'""> 
 
</select>

ben senin sorunun çözümü yalnızca bir bölümüne bahsediyorum biliyorum ama aşağıdaki abone kullanabilirsiniz düşünüyorum seçmek, sana bölmek gerektiğini düşünüyorum veri nesnesini çeşitli denetimlere bağlamak.

+0

Neye ihtiyacım var gibi görünüyor, ben bir örnek yapmaya çalışacağım ve buraya göndereceğim. – xwild

+0

Bu daha iyi olacak, böylece problemi tam olarak çözemeyeceğim ve size göre size yardımcı olabilirim. – Dnyanesh

+0

bazı sonuçlar burada http://jsfiddle.net/xwild/65eq14p3/, henüz tamam değil, şimdi diğer tüm seçimlerin ilk maç seçmek ve tekrarlayan etkileri önlemek için gerekli .. – xwild

İlgili konular