2012-04-19 5 views
0

Я использую ajax для получения частичного документа HTML для использования в качестве шаблона нокаута.Исключение происходит в ie8 при динамическом обновлении шаблона Knockoutjs

HTML:

<script type="text/html" id="LoadingTemplate">Loading...</script> 
<script type="text/html" data-bind="attr: {'id': DynamicTemplateID}, html: ContentHTML></script> 

<div class="main-page" data-bind="template: TemplateID"></div> 

Script (частичное):

self.TemplateID = ko.observable("LoadingTemplate"); 
self.DynamicTemplateID = ko.observable(GenerateUUID()); 

self.ContentHTML = ko.observable();  
ko.computed(function() { 
    var url = self.ContentURL(); 
    self.GetContent(url, function (html) { 
     self.ContentHTML(html); 
     self.TemplateID(self.DynamicTemplateID()); 
    }); 
}); 
  1. Первоначально <div> будет показывать: 'Загрузка'
  2. Атрибут динамического шаблона id устанавливается в сгенерировано ID
  3. GetContent() выполн ет Ajax вызова для извлечения содержимого
  4. Когда вызов Ajax завершает функцию обратного вызова вызывается
  5. Наблюдаемый ContentHTML обновляется с HTML
  6. Наблюдаемый TemplateID устанавливается в сгенерированном ID
  7. <div> является актуализация К.О.

В Firefox это работает как шарм, но IE8 выбрасывает исключение: Error: Unexpected call to method or property access. при обновлении фиктивного <script> тег с загруженным шаблоном.

Ошибка: jQuery.html(). Сначала elem.innerHTML = value; сбой, который улавливается, тогда this.empty().append(value) терпит неудачу, что дает исключение.

Partial 'трассировки стека':

this.appendChild(elem); => callback function in jquery.append (v1.7.2 line 5847) 
jquery.domManip 
jquery.append 
jquery.html 
ko.utils.setHtml 
ko.bindingHandlers.html.update 
ko.applyBindingsToNodeInternal 
ko.dependentObservable.evaluateImmediate 

Что может быть проблема? Есть ли там (известная) проблема IE8 с обновлением тегов <script>?
Есть ли другой способ «хранить» шаблоны внутри html-страницы для использования ko (я предпочитаю использовать традиционный шаблон для ko!)?

ответ

1

Я решил, что с помощью this article на knockmeout.net:

Обновленный HTML (удален динамический <script> тег):

<script type="text/html" id="LoadingTemplate">Loading...</script> 
<div class="main-page" data-bind="template: TemplateID"></div> 

Обновленный скрипт (добавляет тег сценария после загрузки шаблона) :

self.TemplateID = ko.observable("LoadingTemplate"); 
self.dynamicTemplateID = GenerateUUID(); 

ko.computed(function() { 
    var url = self.ContentURL(); 
    self.GetContent(url, function (html) { 
     $("body").append('<script type="text/html" id="' + self.dynamicTemplateID + '">' + html + '</script>'); 

     self.TemplateID(self.dynamicTemplateID); 
    }); 
}); 

Это немного меньше ко-полосная, но работает через всех браузеров ,

Смежные вопросы