2013-07-10 74 views
1

我在我的應用程序KockoutJS External Template Engine中使用能夠加載外部模板文件(所以我可以在很多頁面中再次使用它們)。這是很好的作品,我可以使用另一個文件夾中的模板和數據正確顯示KockoutJS外部模板引擎和自定義綁定

我的問題是,我想調用一些函數,我的模板完全呈現後,我用這個solution自定義綁定(感謝@ RP尼邁耶) 。

問題是在使用外部模板文件時完全呈現模板html之前執行了自定義綁定。

但是使用我的html頁面中存在的模板,在模板html完全呈現後執行自定義綁定。
我的模板:

<script type="text/html" id="report-template"> 
    <li> 
     <a href="#" data-bind="text: Name, click: $root.ReportsViewModel.ShowParameters"></a> 
     <ul data-bind="template: { name: 'report-template', foreach: childItems }"> 
     </ul> 
    </li> 
</script> 

,這就是我如何調用我的自定義綁定jsTree

<div id="reports-tree"> 
    <ul data-bind="template: { name: 'report-template', foreach: $root.ReportsViewModel.Reports }, jsTree: $root.ReportsViewModel.Reports"></ul> 
</div> 

,這就是我的自定義綁定代碼:

ko.bindingHandlers.jsTree = { 
    update: function (element, valueAccessor) { 
     var reports = ko.utils.unwrapObservable(valueAccessor()); 
     if (reports.length > 0) { 
      $(element).parent().jstree({ 
       "themes": { 
        "theme": "default", 
         "dots": false, 
         "icons": true, 
         "utl": "/jstree-style.css" 
       }, 
        "plugins": ["themes", "html_data"] 
      }); 
     } 
    } 
} 
+0

嗨!你會在任何時候迴應我的回答嗎? – Tomalak

+0

我在我的項目中有動畫,我不想添加定時器 –

+0

嗯......但我不添加*真實*定時器 - 將超時設置爲0只是將當前上下文的回調函數解耦。你試過了嗎? – Tomalak

回答

0

This answer建議您可以使用setTimeout來您的優勢:它將您的自定義綁定移動到執行隊列的末尾。

ko.bindingHandlers.jsTree = { 
    update: function (element, valueAccessor) { 
     setTimeout(function() { 
      var reports = ko.utils.unwrapObservable(valueAccessor()); 

      if (reports.length > 0) { 
       $(element).parent().jstree({ 
        "themes": { 
         "theme": "default", 
         "dots": false, 
         "icons": true, 
         "utl": "/jstree-style.css" 
        }, 
        "plugins": ["themes", "html_data"] 
       }); 
      } 
     }, 0); 
    } 
}; 

雖然,我不確定這與遞歸綁定有多好。