Вкратце: я ищу компонентный эквивалент привязки предварительной обработки.
Я пытаюсь инкапсулировать сложные привязки, такие как
<button data-bind="openModalOnClick: {template: '...', action: '...'}, css: {...}">
delete all the things
</button>
в пользовательском элементе, таком как
<confirmation-button>
delete all the things
</confirmation-button>
Для этого я хочу привязать поведение непосредственно к пользовательскому элементу, добавляя к нему привязки на лету.
Я знаю, что мой компонент может вставить кнопку в качестве шаблона, но результирующая разметка
<confirmation-button>
<button data-bind="openModalOnClick: {template: '...', action: '...'}, css: {...}">
delete all the things
</button>
</confirmation-button>
было бы лишним.
В идеале я мог бы использовать регистрацию компонента для динамического добавления необходимых привязок к пользовательскому элементу. Однако (ab) использование createViewModel
для этого, похоже, не работает:
ko.components.register('confirmation-button', {
viewModel: {
createViewModel: function createViewModel(params, componentInfo) {
var Vm;
$(componentInfo.element).attr('data-bind', 'click: function() { confirm("Are you sure"); }');
Vm = function Vm(params) { };
return new Vm(params);
}
},
template: '<!-- ko template: { nodes: $componentTemplateNodes } --><!-- /ko -->'
});
confirmation-button {
border: 1px solid black;
padding: 1rem;
cursor: pointer;
}
<script src="http://knockoutjs.com/downloads/knockout-3.3.0.js"></script>
<confirmation-button>do stuff</confirmation-button>
Можно ли каким-то образом добавить динамические привязки к самим пользовательским элементам?