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.