tutorial knockout inc framework fire espaƱol emblem dxd durandaljs javascript knockout.js durandal

javascript - knockout - KO no puede encontrar la plantilla con ID



durandaljs (2)

El problema es que el elemento de la plantilla KO debe existir en el DOM antes de que se vincule la vista de Durandal. Esto se debe a que la vista está vinculada antes de que se inserte en el DOM, por lo que las plantillas contenidas no se pueden resolver por ID.

Usando una función que devuelve un observable se puede usar para volver a activar un enlace de plantilla. Funciona, pero no funciona. (Un enlace if podría usar para un efecto similar.)

// bind to this in markup: // <div data-bind="template: {name: $root.templateName, .. }"> vm.templateName = function () { return vm.TemplateId(); }; // Changing this will trigger an observable in the KO template binding; // don''t ask me why we have to pass in a function to ''name'' .. vm.TemplateId = ko.observable("dummy-template-id-that-exists"); // After the view is attached the correct template element is in the DOM // so we can trigger the template to (re-)bind and it will find it. function viewAttached () { vm.TemplateId("the-real-template-id"); }

He usado plantillas Knockout antes, así que no estoy seguro de por qué esto no funciona para mí. Probé dos estilos diferentes de ko markup, ninguno de los dos funciona.

<!-- more nesting levels --> <div class="cal-day-tps" data-bind="foreach: timePeriods"> <div class="cal-day-tp-cont"> <div data-bind="template: { name: ''tp-ed-templ'', data: $data }"></div> //both of these methods fail <!-- ko template: { name: ''tp-ed-templ'', data: $data } --> <!-- /ko --> </div> </div> <!-- /more nesting levels --> <script type="text/html" id="tp-ed-templ"> <!-- bunch of markup --> </script>

Acabo de recibir el error "No se puede encontrar la plantilla con ID tp-ed-templ".

Probablemente sea solo un error tipográfico, pero no he podido encontrarlo.

Parece ser un problema con Durandal, no Knockout .

Intenté algunos casos extremadamente simples en configuraciones de vainilla durandal, y todavía hace lo mismo. Incluso intentó poner el script en la misma ubicación anidada que el enlace, sin dados.


La respuesta corta: actualmente no puedes usar plantillas Knockout dentro de Durandal. Sin embargo, como némesv señaló, si coloca su plantilla nombrada fuera de Durandal, ko puede encontrarlas. Por ejemplo, en cualquier lugar fuera del elemento <div id="applicationHost"></div> .

Las otras soluciones alternativas son utilizar la funcionalidad de redacción de Durandal o simplemente incorporar las plantillas como anónimas.

Las plantillas Knockout probablemente serán compatibles en el futuro cercano.

Finalmente investigué estas respuestas en el grupo de Google Durandal,