Knockout 3.2: могут ли компоненты / пользовательские элементы содержать дочерний контент?
Могу ли я создать непустые компоненты Knockout, которые используют в них дочернюю разметку?
Примером может служить компонент для отображения модального диалога, например:
<modal-dialog>
<h1>Are you sure you want to quit?</h1>
<p>All unsaved changes will be lost</p>
</modal-dialog>
Который вместе с компонентом шаблона:
<div class="modal">
<header>
<button>X</button>
</header>
<section>
<!-- component child content somehow goes here -->
</section>
<footer>
<button>Cancel</button>
<button>Confirm</button>
</footer>
</div>
Выходы:
<div class="modal">
<header>
<button>X</button>
</header>
<section>
<h1>Are you sure you want to quit?</h1>
<p>All unsaved changes will be lost</p>
</section>
<footer>
<button>Cancel</button>
<button>Confirm</button>
</footer>
</div>
1 ответ
Решение
Это невозможно в 3.2, однако это будет возможно в следующей версии, см. Этот коммит и этот тест.
А пока вам нужно передать параметры компоненту через params
свойство Определите ваш компонент, чтобы ожидать content
параметр:
ko.components.register('modal-dialog', {
viewModel: function(params) {
this.content = ko.observable(params && params.content || '');
},
template:
'<div class="modal">' +
'<header>' +
'<button>X</button>' +
'</header>' +
'<section data-bind="html: content" />' +
'<footer>' +
'<button>Cancel</button>' +
'<button>Confirm</button>' +
'</footer>' +
'</div>'
});
Передать параметр содержимого через params
имущество
<modal-dialog params='content: "<h1>Are you sure you want to quit?</h1> <p>All unsaved changes will be lost</p>"'>
</modal-dialog>
Смотри скрипку
В новой версии вы можете использовать $componentTemplateNodes
ko.components.register('modal-dialog', {
template:
'<div class="modal">' +
'<header>' +
'<button>X</button>' +
'</header>' +
'<section data-bind="template: { nodes: $componentTemplateNodes }" />' +
'<footer>' +
'<button>Cancel</button>' +
'<button>Confirm</button>' +
'</footer>' +
'</div>'
});
PS Вы можете собрать последнюю версию нокаута вручную, используя приведенный выше код.