He actualizado a la 2.3.0 y ahora estoy recibiendo el error
No puede aplicar los enlaces de varias veces el mismo elemento.
que yo no estaba en 2.2.1.
Estoy obteniendo una vista parcial de mi controlador MVC y agregarlo a la página después de hacer clic en un href. El error ocurre la segunda vez que hago clic en el enlace para obtener la vista parcial. Estoy haciendo esto varias veces.
Hay una forma de borrar esto y evitar el error nuevo lanzado?
Aquí está mi código:
$.get(url + "GetAssignedCompaniesView?layoutId=" + layoutId + "&noCache=" + new Date().getMilliseconds(), function (result) {
$("#editAssignedPartial").html($(result));
showEditAssignedArea(true);
$(window.document).ready(function () {
//error is thrown here
ko.applyBindings(self, window.document.getElementById("editAssigned"));
$("#layoutId").attr("value", layoutId);
updateTypeHiddenElement.attr("value", "companies");
});
});
<div id="editAssignedPartial">
</div>
$(document).ready(function () {
'use strict';
var vm = new Vm();
ko.applyBindings(vm, document.getElementById("area1"));
});
- stopBindings es una mejor manera… knockmeout.net/2012/05/quick-tip-skip-binding.html
Sólo tienes que quitar los enlaces antes de utilizar ‘applyBindings’ de nuevo.
debe hacer el truco. HTH.
var _data = $("view-data"); ko.cleanNode(_data);
ko.cleanNode()
no parece ser la manera más recomendada para evitar el ‘aplicar los enlaces de varias veces el error». stackoverflow.com/a/15069509/538962Algo que puede suceder, así que se lanza esta excepción es la siguiente. Dicen que usted tiene:
Ahora, cuando tanto #element1 y #element2 no existen obtendrá el error. La razón es que Knockout del applyBindings cae de nuevo en el documento.el cuerpo como elemento raíz cuando #element1 y #element2 que no se encuentran. Ahora se trata de aplicar la unión de dos veces en el cuerpo…
No es una buena alternativa de knock-out, si usted me pregunta. Prefiero tener un claro mensaje de error de que el elemento no existe en el DOM (todavía).
Espero que esto ayuda a algunas personas.
document.getElementById('#element1')
. Se olvidó de que el # jquery cosa. De hecho, sería mucho mejor si knockout levantaría un elemento no existe en el DOM de error».Dos cosas son importantes, por encima de las soluciones:
Cuando se aplica a los enlaces, se necesita especificar el alcance (elemento) !!
Cuando el borrado de enlaces, debe especificar exactamente el mismo elemento que se utiliza para el ámbito.
Código está por debajo de
Marcado
Unión de vista
Javascript
Claro enlaces
cleanNode()
?Nunca se debe poner enlaces más de una vez a una vista. En el apartado 2.2, el comportamiento es indefinido, pero aún incompatible. En 2.3, se muestra ahora de forma correcta un error. Cuando el uso de octavos de final, el objetivo es aplicar los enlaces de una vez a la vista(s) en la página, a continuación, utilizar los cambios observables en el viewmodel para cambiar la apariencia y el comportamiento de su vista(s) en su página.
<script type='text/html'>...</script>
a una página para el control de contenido dinámico.applyBindings
llamada es para el ámbito global, aparecerá un mensaje de error: knockoutjs.com/documentation/observables.htmlHay una gran cantidad de respuestas para este problema, pero tengo un noobie respuesta.
Me encontré con que se me ha añadido la misma secuencia de Comandos en dos lugares y se estaba tratando de enlazar dos veces. Así que antes de tirar de su pelo en un simple error, asegúrese de que usted echa para este problema.
Finalmente he resuelto de la mina por la devolución de los
{ controlsDescendantBindings: true }
en elinit
función de la unión de controlador. Ver esteSi va a reutilizar un elemento más y más (Un bootstrap de diálogo modal en mi caso), a continuación, llamar a
ko.applyBindings(el)
varias veces le causa este problema.Lugar de sólo hacerlo una vez como esta:
O como este:
PS: Esto puede ocurrir más a menudo para usted si usa la asignación plugin y convertir sus datos en JSON a las características observables.
He tenido este error ocurre por una razón diferente.
He creado una plantilla para guardar/cancelar los botones que yo quería aparecer en la parte superior y la parte inferior de la página. Funciono a la primera, cuando tuve mi plantilla definida dentro de un <script type=»text/html»> elemento…. pero luego escuché si lo desea, podría crear una plantilla de ordinario elemento DIV en lugar.
(Esto funcionó mejor para mí, ya que yo estaba usando ASP.NET MVC y ninguno de mis @variableName la sintaxis de Afeitar se ejecuta en tiempo de ejecución desde el interior del elemento de secuencia de comandos. Así que al cambiar a un DIV en lugar de eso, yo todavía podría tener el MVC Razor motor de generar HTML dentro de mi KnockoutJs plantilla cuando se carga la página.)
Después de que he cambiado mi plantilla para usar un DIV en lugar de un elemento de secuencia de COMANDOS, mi código veía como este…. lo que funcionó bien en IE10. Sin embargo, más tarde cuando lo probé en IE8, arrojó que….
«No puede aplicar los enlaces de varias veces el mismo elemento» de error…..
HTML
JavaScript
LA SOLUCIÓN:
Todo lo que tenía que hacer era mover mi saveButtons_template DIV abajo a la parte inferior, por lo que estaba fuera de la mainKnockoutDiv. Ya esta resuelto el problema para mí.
Supongo KnockoutJs estaba tratando de enlazar mi plantilla DIV varias veces debido a que se encontraba en el interior de la applyBindings área de destino… y no estaba usando el elemento de secuencia de COMANDOS…. y era que se hace referencia como una plantilla.
Estaba recibiendo el mismo error en IE7/IE8. Trabajó muy bien en todos los navegadores incluyendo IE9/IE10.
Lo que he encontrado trabajado para mí fue la eliminación de auto etiquetas de cierre.
Mal
Buena
En mi caso, yo estaba sumando un no existente elemento, o, yo era la adición de enlaces a un elemento que tal vez existe, pero el padre no. Similar a este:
Medida de lo que puedo decir, este error parece un poco sobrecargado, en el sentido de que el fuego en un montón de diferentes errores que pueden suceder con el elemento, como no existente. Como tal, la descripción de un error pueden ser muy engañosos. Se debe probablemente ha leído:
«Error al enlazar los enlaces a elemento. Posibles razones incluyen: la unión de múltiples intentos, el elemento no existente, elemento no está en el DOM de la jerarquía, a las peculiaridades de los navegadores, etc»
Respuesta Actualizada
Ahora que podemos utilizar
dataFor()
para comprobar si el enlace se ha aplicado, prefiero compruebe el enlace de datos, en lugar decleanNode()
yapplyBindings()
.Como este:
Respuesta Original.
Un montón de respuestas ya!
Primero, digamos que es bastante común que necesitamos para hacer el enlace varias veces en una página. Decir, tengo un formulario en el interior de la modal de Bootstrap, que va a ser cargado de nuevo y de nuevo. Muchos de la forma de entrada tiene dos vías de enlace.
Yo suelo tomar el camino fácil: la limpieza de la unión cada vez que antes de la unión.
Sólo asegúrese de que aquí
koNode
es necesario, para que,ko.cleanNode()
requiere un nodo de elemento, aunque se pueden omitir enko.applyBinding(vm)
.yo tenía el mismo problema y lo resolví.
que funciona para mí, pero como otros nota, el
cleanNode
es internako
función, por lo que es probable que exista una mejor manera.