L'obiettivo principale era, ovviamente, rispettare il pattern MVVM anche nell'uso del framework di Twitter ed evitare che l'iniezione asincrona nel DOM di pezzi di UI rompesse l'applicazione del plugin al $(document).ready().
Mi si è aperta, però, un'altra possibilità...
I Popovers di BS non supportano nativamente l'opzione target, come invece fanno i Modals.
E questo è un peccato: definire direttamente nel markup il contenuto html è, di nuovo, perfettamente compliant al MVVM e offre una flessibilità impagabile.
Ho quindi delegato al binding la valorizzazione del content nei due casi:
- che sia valorizzata l'opzione content
- che sia valorizzata l'opzione target (non nativa) con il selettore di un oggetto definito nel DOM
/**
KnockOut Custom Binding for Bootstrap Popovers (http://twitter.github.com/bootstrap/javascript.html#popovers)
Author: lightwalker
**/
(function ($) {
if (ko && ko.bindingHandlers) {
ko.bindingHandlers.bsPopover = {
init: function (element, valueAccessor) {
var val = ko.utils.unwrapObservable(valueAccessor());
var options = { title: val.title,
animation: val.animation,
placement: val.placement,
trigger: val.trigger,
delay: val.delay,
//can grab html content from a target option
content: ($(val.target).html() != null) ? $(val.target).html() : val.content
};
$(element).popover(options);
}
};
};
})(jQuery);
E qui il frammento di view:<!-- popover activator -->
<a href="#" class="btn btn-danger" rel="popover" data-bind="bsPopover:{title: vmObservable(), target:'#popover-content'}">Hover Me!</a>
<!-- popover html content -->
<div id="popover-content" class="hide"><b>Custom HTML Content</b></div>
E allora... Buon binding a tutti!
Edit: continua con: Custom bindings rulez (again)
Nessun commento:
Posta un commento