Alrighty dank @devspec für Ihre erste Antwort. Ich baute auf es in einigen entscheidenden Punkten:
so meine letzte Bindung Handler ist:
ko.bindingHandlers.clipboard = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// This will be called when the binding is first applied to an element
// Set up any initial state, event handlers, etc. here
var options = ko.unwrap(valueAccessor());
if(options.textComputed) {
options.text = function(nodeToIgnore) { return options.textComputed(); };
}
if(options.onmodal) {
options.container = element;
}
var cboard = new Clipboard(element, options);
if(options.success) {
cboard.on('success', options.success);
}
if(options.error) {
cboard.on('error', options.error);
}
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
// This will be called when the element is removed by Knockout or
// if some other part of your code calls ko.removeNode(element)
cboard.destroy();
});
},
}
Und ein Beispiel für die Nutzung ist:
Die Html:
<a href="#" data-bind="clipboard: { onmodal: true, textComputed: command, success: function(event) { copyCommandResult(true, event); },
error: function(event) { copyCommandResult(false, event); }}"><small
data-bind="text: clipboardLink ">copy to clipboard</small></a>
auf die view model command ist eine berechnete, wenn es eine Funktion war, die eine Zeichenkette (ohne ein Argument) zurückgab, konnte das Textattribut nur
012 verwendet werden
Und die copyCommandResult ist einfach:
self.copyCommandResult = function(success, e) {
// console.log("Copy to clipboard success? " + success)
// console.info('Action:', e.action);
// console.info('Text:', e.text);
// console.info('Trigger:', e.trigger);
if(success) {
self.clipboardLink("Copied successfully!");
} else {
self.clipboardLink("Could not copy to clipboard");
}
setTimeout(function(){ self.clipboardLink(DEFAULT_CLIPBOARD_LINK_TEXT); }, 3000);
}
Ich glaube, dies Auswirkungen auf die Leistung haben, Clipboard.js können Sie mehrere Elemente angeben, um ihre Veranstaltungen zu einem globalen Handler zu delegieren. Aber ich weiß nicht genug, um eine bessere Antwort zu geben. Upvoted, und Sie sollten wahrscheinlich Ihre eigene Antwort akzeptieren, es ist lange genug. –