2011-11-25 3 views
9

En general, soy un gran admirador de la propiedad afterAdd de la unión de datos de plantilla en KnockoutJS. Sin embargo, me parece que mis devoluciones de llamada afterAdd siempre se golpean 3 veces, y no estoy seguro de por qué. ¿Estoy haciendo algo incorrectamente?KnockoutJS llamando a la función afterAdd en elementos de espacio en blanco

devoluciones de llamada funciona de esta manera:

  • llamada 1: textNode
  • Llamada 2: Elemento real que me importa
  • Llamada 3: textNode

Para hacer frente, todos mis manejadores terminar teniendo un cheque para isElementContentWhitespace como en el siguiente:

HTML

<ul class="t" data-bind="template: {name: 'itemTmplt', foreach: items, afterAdd: function(elem, idx, val) {my.ko.itemAdd(elem, idx, val);} }"> 
</ul> 
<script id="itemTmplt" type="text/html"> 
    <li class="tbl" data-bind="attr: {id: name}"> 
     <h3 data-bind="text: name"></h3> 
    </li> 
</script> 

JS

my.ns("mme.ko"); 
my.ko = (function() { 
    "use strict"; 

    return { 
     itemAdd: function (elem, idx, val) { 
      if (elem.isElementContentWhitespace) { return; } 

      /*** do stuff here ***/ 
     } 
    }; 
}()); 

Respuesta

8

afterAdd actualmente se llama nodo foreach que Knockout encuentra en su plantilla.

Si no desea comprobar la nodeType, entonces se puede despojar a los espacios en blanco en su plantilla como:

<script id="itemTmplt" type="text/html"><li class="tbl" data-bind="attr: {id: name}"><h3 data-bind="text: name"></h3></li></script> 

Con esta plantilla, sólo verá afterAdd llamada en el elemento li.

Cuestiones relacionadas