2013-08-09 11 views
6

Uprośrzyłem mój problem tak bardzo, jak to możliwe. Dzieje się tak tylko w Internet Explorerze (potwierdzono 9 i 10). Mam stronę renderowany z tym:IE 10 + KnockoutJS = HierarchyRequestError?

<html> 
<body> 

    <span data-bind="text:$data[0].Mileage"></span> 
    <script type="text/javascript"> 
     window.initChild = function (ko, viewModel) { 
      window.ko = ko; 
      ko.applyBindings(viewModel, document.body); 
     } 
    </script> 
</body> 
</html> 

My SPA wywołuje

var otherWindow = window.open('myurl', '_blank'); 
    var handler = function() { 
     otherWindow.initChild(ko, report); 
    }; 
    if (otherWindow.addEventListener) { 
     otherWindow.addEventListener('load', handler, false); 
    } else if (otherWindow.attachEvent) { 
     otherWindow.attachEvent('onload', handler); 
    } 

Sprawdziłem, dane docierają w metodzie initChild porządku.

Jeśli wiążę WSZYSTKO na stronie, otrzymuję HierarchyRequestError w wywołaniu applyBindings. Mój google-fu całkowicie mnie porzucił, jestem całkowicie nieświadomy, co jest nie tak.

+0

Jest oznakowany jako IE. Czy to się nie dzieje w innych przeglądarkach? – Amy

+0

nie, nie ma. Kod (i jego oryginalny, bardziej złożony odpowiednik) działa dobrze w FF i Chrome. – TDaver

+0

'$ data [0] .Milage' wydaje się mało prawdopodobne, że twój viewmodel jest tablicą. – Tyrsius

Odpowiedz

3

O ile mogę powiedzieć, że był to objaw tego problemu: Using Javascript objects across separate windows in IE

zasadzie, nie ważne jak mijałem obiekt ko do okna potomnego, coś zabłądził, a gdy próbowałem stosowania Wiązania, sam ko wpadł na błąd śledzenia DOM i próbował wstawić coś gdzieś, czego nie powinien mieć (być może część nadrzędnego DOM do potomnego DOM).

Rozwiązaniem było dwojakie:

  • Dodaj KO (i ko.mapping) skryptów do okna dziecka, aby mieć swój własny obiekt ko
  • serializacji modelu z ko.mapping do JSON , przekaż ciąg do okna podrzędnego i przekształć go w deserializację.

Horrible zachowanie IE ...

Jeśli ktoś może wymyślić rzeczywiste wyjaśnienie, dlaczego to się dzieje, będę akceptować jego odpowiedź zamiast.