2012-04-19 12 views
0

ajaxを使用して、一部のHTMLドキュメントを取得してKnockoutテンプレートとして使用します。Knockoutjsテンプレートを動的に更新するときにie8が発生する

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> 

スクリプト(部分):

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属性がに設定されている
  3. 生成ID
  4. GetContent() AJAX呼び出しがコールバック関数が観測可能ContentHTMLが観測可能TemplateID<div>が生成されたID
  5. に設定されているHTML
  6. で更新され
  7. と呼ばれる終了すると、コンテンツ
  8. を取得するために、AJAX呼び出しを行い、 Firefoxでは

KOによって更新これは魔法のように動作しますが、IE8は例外をスロー:Error: Unexpected call to method or property access.をロードされたテンプレートを使用してダミー<script>タグを更新中。

エラーは、jQuery.html()によってスローされます。最初にelem.innerHTML = value;が失敗し、これがキャッチされ、this.empty().append(value)が失敗し、例外が発生します。

部分的な 'スタックトレース':

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 

何が問題だろうか? <script>タグを更新している(既知の)IE8の問題がありますか?
koが使用するhtmlページ内にテンプレートを保存する別の方法はありますか(私はkoネイティブテンプレートを使用することを好みます)。

答えて

1

私はknockmeout.netにthis articleを使用して、それを解決してきました:

更新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); 
    }); 
}); 

は、これはあまり少しがko-方法ですが、すべてのブラウザで動作します。

関連する問題