2012-12-18 3 views
8

Es ist wie die Bindung <event>Bubble: false scheint nur funktioniert, wenn es gibt a defined event handler (siehe Anmerkung 4) für <event>.knockoutjs: verhindern sprudelnden Ereignis für Elemente ohne Handler

Hier ist ein Beispiel fiddle.

Für Elemente mit nativer Behandlungsroutinen für bestimmte Ereignisse (zB klicken: <textarea>, <a>, <select>, etc.), wo der native Handler genügt, würde ich erwarten, dass die Bindungseinstellung, zB clickBubble: false auf sich, ohne dass ein binden "falscher" Handler, um zu arbeiten.

Ich denke meine Frage ist, gibt es einen anderen Knockout Weg, um dies ohne zusätzliche Bindungen zu erreichen?

Antwort

22

Die Bubble Handler sind nicht unbedingt verbindlich Handler und werden als Optionen in den event Bindung (click Bindung Anrufe event Bindung) verwendet. Sie laufen also nicht alleine.

So können Sie einen "falschen" No-Op-Handler hinzufügen und clickBubble verwenden, oder Sie könnten sicherlich eine benutzerdefinierte Bindung erstellen, um dies für Sie zu tun.

Vielleicht so etwas wie:

ko.bindingHandlers.preventBubble = { 
    init: function(element, valueAccessor) { 
     var eventName = ko.utils.unwrapObservable(valueAccessor()); 
     ko.utils.registerEventHandler(element, eventName, function(event) { 
      event.cancelBubble = true; 
      if (event.stopPropagation) { 
       event.stopPropagation(); 
      }     
     }); 
    }   
}; 

Und dann setzen gerade:

<input data-bind="preventBubble: 'click'" /> 

Sie auch es verbessern könnte weiter eine Reihe von Veranstaltungen zu übernehmen, falls erforderlich.

Beispiel: http://jsfiddle.net/rniemeyer/WcXwZ/

+0

Danke, RP. Ich denke, das benutzerdefinierte Binden und Verwenden der Bibliothek "utils" ist Ihrer Ansicht nach viel attraktiver für Multi-ViewModel-Apps und wiederverwendbar als das Shimming von falschen Handlern für jede VM-Klasse. Ich habe Ihre Antwort beantwortet und gebe die Frage nur einen Tag oder so an, um fair zu sein, für andere Lösungen. Ich werde nicht vergessen, den elegantesten/nützlichsten, ehrlich-Motor zu wählen. – Steven