2012-04-11 16 views
145

ViewModel'imdeki bir özelliği kullanmak için, hangi simgenin, tersin ayrı bir hesaplanmış özelliği oluşturmadan görüntüleneceğini değiştirmek istiyorum. Mümkün mü?Veri bağlama, bir boolean ViewModel özelliğinin olumsuzluğu ("!") Ile görülebilir mi?

var month = function() { 
    this.charted = ko.observable(false); 
}; 
+3

@Niko: Gerçekten yinelenen bir soru değil. Başvurduğunuz sorunun OP'si, ** 'nin gözlemlenebilir bir olumsuzluğa veri bağlamanın mümkün olduğunu, ancak bunun neden bir işlev olarak çağrılması gerektiğini merak ettiğini biliyordu. Bu sorunun OP'si, ilk etapta bunu nasıl yapacağını bilmiyordu ve açıkçası başka bir soru bulamadı. Bu soruyu burada bulduğuma sevindim - ki bu çoğunlukla tanımlayıcı başlığı sayesinde. – Oliver

cevap

251

bir ifadede gözlemlenebilir kullanarak gibi bir fonksiyonu olarak erişmesi gereken:

<tbody data-bind="foreach: periods"> 
    <tr> 
    <td> 
     <i class="icon-search" data-bind="visible: !charted, click: $parent.pie_it"></i> 
     <i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i> 
    </td> 
    </tr> 
</tbody> 

Benim ViewModel böyle ayın bir dizidir bir özellik dönemleri vardır

visible: !charted()

+30

Belki de gizli bir bağlayıcı yapmalıyız :) Etkinleştirdik ve devre dışı bıraktık. –

+0

Dokümantasyon bununla çelişiyor mu, yoksa bu sayfayı tamamen yanlış anlamıyorum mu? Http://knockoutjs.com/documentation/css-binding.html –

+0

Nevermind, sanırım "isSevere" gözlemlenebilir değil, sade bir eski özellik, karışıklığım. –

48

Benyerleşik olması gerektiğini John Papa yorumuna katılıyorumbağlama.

  1. basit sözdizimi, yani: bağlayıcı adanmış hidden iki faydası vardır. visible: !charted() yerine hidden: charted.
  2. Knockout, computed'u !charted() gözlemlemek yerine, gözlemlenebilir charted doğrudan gözlemleyebileceğinden, daha az kaynak.

Böyle olsa da, bir hidden bağlayıcı yaratacak kadar basit:

ko.bindingHandlers.hidden = { 
    update: function(element, valueAccessor) { 
    ko.bindingHandlers.visible.update(element, function() { 
     return !ko.utils.unwrapObservable(valueAccessor()); 
    }); 
    } 
}; 

Sadece gibi kullanabilirsiniz yerleşik visible bağlayıcı:

<i class="icon-search" data-bind="hidden: charted, click: $parent.pie_it"></i> 
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i> 
+9

bu geri dönüşü olmayan benim için işe yaramadı! Ko.utils.unwrapObservable (valueAccessor()); –

+0

Teşekkür @ MehmetAtaş - Senin yorum başına "gizli" bağlama düzeltildi. (BTW, orjinal olarak yayınladığım zaman projemde CoffeeScript kullanıyordum. CoffeeScript'in sözdizimi, bir getiri kasıtlı olduğunda açıklığa kavuşmuyor.) – Dave

3

Şunları kullanabilirsiniz case.visible ve casenot.visible'u içeren switch/case bağlayıcım.

<tbody data-bind="foreach: periods"> 
    <tr> 
     <td data-bind="switch: true"> 
     <i class="icon-search" data-bind="case.visible: $else, click: $parent.pie_it"></i> 
     <i class="icon-remove" data-bind="case.visible: charted, click: $parent.pie_it"></i> 
     </td> 
    </tr> 
</tbody> 

Ayrıca

visible:!showMe() 

yapmak zorunda olduğu

<span data-bind="visible:showMe">Show</span> 
<span data-bind="visible:!showMe()">Hide</span> 
<label><input type="checkbox" data-bind="checked:showMe"/>toggle</label>​ 

benim modeldir Bu biraz kafa karıştırıcı, bu yüzden, ben

yaptım oluyor

 <i class="icon-search" data-bind="casenot.visible: charted, click: $parent.pie_it"></i> 
     <i class="icon-remove" data-bind="case.visible: $else, click: $parent.pie_it"></i> 
+0

Bunun eski bir soru olduğunu anladım, ancak bunun yararlı olabileceğini umuyorum. birisi. –

1

, ben görünür bağlanma işleyicisi kopyalanmış ve onu ters:

ko.bindingHandlers.hidden = { 
    update: function (element, valueAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     var isCurrentlyHidden = !(element.style.display == ""); 
     if (value && !isCurrentlyHidden) 
      element.style.display = "none"; 
     else if ((!value) && isCurrentlyHidden) 
      element.style.display = ""; 
    } 
}; 
0

Destek bu çözümü Sadece eğlence amaçlı kullanıma uygundur.

ko.extenders.not = function (target) { 
    target.not = ko.computed(function() { 
     return !target(); 
    }); 
}; 

self.foo = ko.observable(true).extend({ not: null }); 

<div data-bind="text: foo"></div>  <!-- true --> 
<div data-bind="text: foo.not"></div> <!-- false --> 

<!-- unfortunately I can't think of a way to be able to use: 
    text: foo...not 
--> 
-1

Ayrıca böyle gizli kullanabilirsiniz:

<div data-bind="hidden: isString"> 
          <input type="text" class="form-control" data-bind="value: settingValue" /> 
         </div> 
İlgili konular