me he encontrado con varias situaciones en las que tengo que codificar mi llamada plantilla de la siguiente manera:sintaxis extendida para pasar parámetros a las plantillas KnockoutJS
<!-- ko template: {name: 'paginatedList',
data: {listContainer: paginatedResults, itemTemplate: $parent.template}} -->
<!-- /ko -->
porque además de mi objeto de datos (por ejemplo, paginatedResults
), I necesita pasar información suplementaria, como el nombre de la plantilla para usar en la representación de elementos. Como otro ejemplo, al representar un elemento en una lista, es posible que necesite conocer la configuración actual de un filtro que está almacenado en algún contexto lógicamente muy alejado del elemento en una lista.
En lugar de tener que retorcer mi modelo de datos (en el ejemplo anterior, en sustitución de paginatedResults
con {listContainer: paginatedResults, itemTemplate: $parent.template}}
, sería bueno tener un poco de sintaxis en plantillas que me permite pasar alrededor (y acccrue como plantillas son evaluados de forma jerárquica) un poco de contexto adicional que puede ser que necesite una plantilla están anidadas cuando se representa a sí mismo.
creo que lo que se pregunta sobre es la posibilidad de añadir un parámetro adicional (opcional) a las ko.bindingHandlers
funciones (init
y update
) para que se vean como esto:
function (element,
valueAccessor,
allBindingsAccessor,
viewModel,
bindingContext,
context)
Al codificar el ejemplo anterior, debería ser capaz de decir algo como
<!-- ko template: {name: 'paginatedList',
data: paginatedResults,
context: {itemTemplate: $parent.template}} -->
<!-- /ko -->
o mejor aún,
<!-- ko template: {name: 'paginatedList',
data: paginatedResults,
itemTemplate: $parent.template} -->
<!-- /ko -->
y tienen itemTemplate
convertido en una variable que pueda hacer referencia a las plantillas anidadas y data-bind
atributos.
¿Tiene esto sentido? No entiendo muy bien lo difícil que sería implementarlo. Supongo que una cosa de la que preocuparse son las colisiones de nombres, pero algunas convenciones de nombres podrían eludir eso.
génica
Gracias! Estoy de acuerdo en que hace lo correcto, pero no es suficiente para garantizar un controlador vinculante adicional. Sería interesante ver con qué frecuencia aparece este patrón en aplicaciones complejas. –
Gracias me ayuda mucho.Si escribo un envoltorio de plantilla, ¿puedo establecer el nombre de la plantilla dentro del 'init'? – tbruyelle
@tbruyelle - definitivamente puede establecer el nombre. La idea sería que dentro de su encuadernación empaqueta las opciones que desea pasar al encuadernado de plantilla real. Aquí hay una muestra que es tal vez un poco más genérica de lo que necesita (simplemente podría establecer el nombre en el objeto valueAccessor()): http://jsfiddle.net/rniemeyer/7rcFD/ –