Veriye bağlı görünümlerde If-Else yapıları nasıl şablonlanır?


95

Kendimi sürekli olarak KO tabanlı HTML şablonlarında şu deyimi kullanırken buluyorum:

<!-- ko if: isEdit -->
<td><input type="text" name="email" data-bind="value: email" /></td>
<!-- /ko -->
<!-- ko ifnot: isEdit -->
<td data-bind="text: email"></td>
<!-- /ko -->

KO'da koşullu yapmanın daha iyi / daha temiz bir yolu var mı, yoksa sadece geleneksel eğer-değilse yapılarını kullanmaktan daha iyi bir yaklaşım var mı?

Ayrıca, Internet Explorer'ın (IE 8/9) bazı sürümlerinin yukarıdaki örneği doğru şekilde çözümlemediğini belirtmek isterim. Daha fazla bilgi için lütfen bu SO sorusuna bakın . Hızlı özet, IE'yi desteklemek için tablo etiketlerinin içinde yorumları (sanal bağlamalar) kullanmayın. Kullanım tbodyyerine:

<tbody data-bind="if: display"><tr><td>hello</td></tr></tbody>

Yanıtlar:


64

Bu tür bir kodu kullanmanın birkaç farklı yolu vardır.

  • şimdi olduğu gibi bir if / ifnot kombinasyonu ile. Bu iyi çalışıyor ve aşırı derecede ayrıntılı değil.

  • Michael Best'in anahtar / durum bağlama ( https://github.com/mbest/knockout-switch-case ) oldukça esnektir ve bunu ve daha karmaşık olanları (doğru / yanlıştan daha fazla durum) kolayca yönetmenize izin verebilir.

  • Diğer bir seçenek de dinamik şablonlar kullanmaktır. Bir alanı bir veya daha fazla şablona, ​​bir gözlemlenebilirliğe dayalı olarak kullanılan şablon adı ile bağlarsınız. İşte bu konu hakkında bir süre önce yazdığım bir gönderi: http://www.knockmeout.net/2011/03/quick-tip-dynamically-changing.html . Senaryonuzda şöyle görünebilir:

<td data-bind="template: $root.getCellTemplate"></td>

<script id="cellEditTmpl" type="text/html">
    <input type="text" name="email" data-bind="value: email" />
</script>

<script id="cellTmpl" type="text/html">
    <span data-bind="text: email"></span>
</script>

getCellTemplateFonksiyon her yerde yaşayabilir, ancak ilk argüman olarak öğe ($ data) verilecek ve kullanımına şablonun adını döndürecektir.


tuhaf, HTML’im görünmeyecek. Ayrıca Michael'ın hemen hemen aynı cevabı verdiğini fark ettim.
RP Niemeyer

Kapsamlı bir seçenek listesi için teşekkürler. Sanırım orijinal kod stilim basit durumlarda işe yarıyor. İhtiyaç duyulduğunda diğer seçenekleri kontrol edeceğim.
Jensen Ching

"template: data, proppertyName: 'email'" ve şablon data-bind = "text: $ data [propertyName]" gibi şablonu daha da özelleştirmenin bir yolu var mı?
Onur Topal

@OnurTOPAL - evet, bir değişkeniniz olduğu sürece propertyName, şablon adını dinamik olarak belirleyebilirsiniz.
RP Niemeyer

44

Bir yaklaşım, adlandırılmış şablonlar kullanmaktır (bu, argümanların iletilmesini destekleyebilir):

<!-- ko template: isEdit() ? 'emailEdit' : 'emailDisplay' --><!-- /ko -->
<script id="emailEdit" type="text/html">
    <td><input type="text" name="email" data-bind="value: email" /></td>
</script>
<script id="emailDisplay" type="text/html">
    <td data-bind="text: email"></td>
</script>

Diğer bir seçenek de benim anahtar / durum eklentimi kullanmaktır , bu da şu şekilde çalışır:

<!-- ko switch -->
    <!-- ko case: isEdit -->
        <td><input type="text" name="email" data-bind="value: email" /></td>
    <!-- /ko -->
    <!-- ko case: $else -->
        <td data-bind="text: email"></td>
    <!-- /ko -->
<!-- /ko -->

Teşekkürler. İhtiyaç duyulduğunda anahtar / durum eklentisini aklımda tutacağım.
Jensen Ching

2
Güzel eklenti var! Bunu kesinlikle kullanacak.
Kukks

Adlandırılmış şablonlar harika çalışıyor ve eğer elseif elseif else tip senaryolarını üçlü operatörün iç içe geçmesiyle destekliyor.

4

İf: / ifnot kombinasyonunu kullanırken nakavt bağlamanın yeniden hesaplanmasını önlemek için: bunları 'with:' yapısıyla birlikte kullanabilirsiniz

    <!-- ko with: $data.DoSomePerformanceCriticalWork($data.SomeParameter()) -->
        <!-- ko if: $data.Condition() -->
           ... some markup ...
        <!-- /ko -->
        <!-- ko ifnot: $data.Condition() -->
           ... some markup ...
        <!-- /ko -->
    <!-- /ko -->

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.