2013-08-09 11 views
6

KnockoutJS'de bir 'koşullu tıklama' bağlaması oluşturmak istiyorum. Temelde bu, Knockout'ta kullanacağınız gibi standart bir tıklama ciltlemesidir, ancak ekli işlevin yürütülmesi için bir koşulun karşılanması gerekir. Benim durumumda, en iyi seçenek, izin verildiyse standart tıklama ciltlemesini aradığınız özel bir bağlayıcı aracı oluşturmaktır.Standart çağrıyı yap Knockout özel ciltlemeden bağla tıklat

ko.bindingHandlers.safeClick = { 
    'init': function(element, valueAccessor, allBindingsAccessor, context) { 
     $(element).click(function() { 
      if(mycondition == true) { 
       // call the standard click binding here -> this is the part I don't know 
      } 
     }); 
    } 
} 

bu özel bağlama ile benim standart tıklama bağlamaları tüm değiştirmek istiyor. Bu nedenle, tıklama ciltlemesini doğru şekilde çağırmak önemlidir, böylece HTML'de sağlanan tüm parametreler işleve iletilir. Örneğin: özel bağlama eksik kısmı ile bana yardımcı olur musun

<a href="#" data-bind="click: basevm.gotopage.bind($data, '#homepage')">Home</a> 
<a href="#" data-bind="click: itemvm.activateItem">Activate</a> 

Bunlar ben çok takdir ediyorum

<a href="#" data-bind="safeClick: basevm.gotopage.bind($data, '#homepage')">Home</a> 
<a href="#" data-bind="safeClick: itemvm.activateItem">Activate</a> 

tarafından değiştirilmesi gerekir.

ko.bindingHandlers.click.init(element, valueAccessor, allBindingsAccessor, context); 

EDIT:

cevap

11

doğru yolu burada biding tıklayın temsilci şudur:

  • orijinal işlevinizi (ör. valueAccessor() kullanarak)
  • Durumunuzu içeren ve daha sonra özgün işlevinizi çağıran yeni bir işlev döndüğünüzde yeni bir değer saptama işlevi oluşturun. Ve bu yeni değer yargıcısını click bağlayıcıya geçirin.

Yani safeClick aşağıdaki gibi görünecektir:

ko.bindingHandlers.safeClick = { 
    'init': function (element, valueAccessor, allBindingsAccessor, 
         viewModel, bindingContext) { 
     var originalFunction = valueAccessor(); 
     var newValueAccesssor = function() { 
      return function() { 
       if (mycondition == true) 
        //pass through the arguments 
        originalFunction.apply(viewModel, arguments); 
      } 
     } 
     ko.bindingHandlers.click.init(element, newValueAccesssor, 
      allBindingsAccessor, viewModel, bindingContext); 
    } 
} 

Demo JSFiddle.

Bu, ilk tıklama için çalışır ve tıklama etkinliğine el ile abone olmanız veya jQuery ile tetiklemeniz gerekmez.

+0

Bu yöntem, koşulunuzu HTML kodunda gözlemlenebilir bir Nakavt olarak ilettiğinizi varsayar. Bunu yapmak istemiyorum. Bunun yerine, eleman her tıklandığında JavaScript kodunu manuel olarak kontrol etmek istiyorum. Bunun nasıl yapılacağı konusunda tavsiyen var mı? –

+0

if if (ko.utils.unwrapObservable (allBindingsAccessor(). Koşulu)) 'yerine ne istediğinizi yazabilirsiniz. Link her tıklandığında değerlendirilecektir. Demo jsfiddle'ım için gözlemlenebilir şartlara ihtiyacım vardı. Bu değiştirilmiş kült görmek: http://jsfiddle.net/w7nKB/2/ – nemesv

+0

Ben normal tıklama ciltleme ve bu özel ciltleme arasındaki sorunu göstermek için bu keman (http://jsfiddle.net/Ed8Fc/) oluşturdu. Tıklama etkinliğini tetikleyen DOM öğesine erişmem gerekiyor. Bunu, normal tıklama ciltlemeyle tamam, ancak safeClick bağlamasının tarayıcı konsolunda bildirilen bir hata olduğunu görüyorsunuz. –

1

Sen aşağıdaki gibi diyebilirsiniz Sen mannualy edebilirsiniz olay ilk kez tıklayın çağırır:

ko.bindingHandlers.safeClick = { 
    'init': function(element, valueAccessor, allBindingsAccessor, context) { 
     $(element).click(function() { 
      if(mycondition == true) { 
       ko.bindingHandlers.click.init(element, valueAccessor, allBindingsAccessor, context); 
      } 
     }); 
     if(mycondition == true) { 
      $(element).trigger('click'); 
     } 
    } 
} 
+0

Web'de arama yaparken bunu daha önce gördüm. Maalesef, bunun yalnızca bağlantı elemanını ikinci kez tıkladığınızda çalıştığını keşfettim. Çözümüm, kullanıcının ilk tıkladığı anda çalışmalıdır. –

+0

Güncellemeye bakın, bunun yardımcı olacağını umuyoruz. –