2013-04-11 78 views
4

我知道有更好的模式,但在這種情況下,有一些我們想要移動到視圖的遺留代碼。此html有一個如何阻止durandal/jquery從視圖中刪除腳本標記?

<script src="binding.js"></script> 

需要在頁面呈現和顯示後運行。

我希望用<script src="">標籤來做到這一點,但標籤似乎被剝離了。

我們如何獲得腳本標記進行渲染,或者使用durandal進行解決?

HTML示例:

<div> 
    <link rel="stylesheet" href="/Content/stylesheet1.css"/> 
    <link rel="stylesheet" href="/Content/stylesheet2.css"/> 
    <header> 
     <h1>heading</h1> 
     <h2>sub heading</h2> 
    </header> 

    <section> 
    </section> 

    <footer>    
    </footer> 
    <script src="dobinding.js"></script>  
</div> 

這是有幫助的:

http://knockoutjs.com/documentation/custom-bindings.html 

回答

4

可能使用自定義KnockOut綁定。

這裏是一個非常簡單的綁定 - 記住這只是一個想法:

ko.bindingHandlers.script = { 
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var scriptName = ko.utils.unwrapObservable(valueAccessor()); 
     $(element).html("<script src='" + scriptName + "'></script>"); 
    } 
}; 

在您的視圖(.html文件):

<div data-bind="script:'dobinding.js'"></div> 

我測試了這一點,而且我發現,該腳本實際上是注入,分析和執行的,但它並不保持加載到DOM中。這對你來說可能是或可能不是問題。

似乎剝離標籤可能是Durandal特定的事情。我還沒有找出原因,但如果我有機會深入瞭解,我會更新。

+0

感謝您確認行爲。我會試試你的想法。 TY。 – sgtz 2013-04-12 04:23:08

+0

您是如何驗證腳本注入的? Chrome開發工具中DOM元素的屬性?該腳本只需要執行。 – sgtz 2013-04-12 04:57:30

+0

我在腳本中添加了一些警報並執行。我使用Chrome開發工具來驗證DOM中的腳本標記是* not *。就你而言,也許標籤本身沒有被注入到主DOM中,但它必須被注入到視圖的DIV中,因爲這就是綁定的工作方式 - 直接設置html內容'$(element).html(.. );' – 2013-04-12 11:53:06

1

我相信迪朗達爾視圖合成引擎只使用第一個HTML元素在視圖中,而忽略其他一切。因此,如果您的腳本標記位於視圖中的主容器之外,我認爲它會被丟棄。

你可以發表一些HTML/JS審查?

+0

包括的例子。我也嘗試了div內部和外部的腳本標記。 – sgtz 2013-04-11 16:53:28

+0

嗯,也許你不能從那裏引用外部腳本文件。腳本文件中有什麼,你可以從主html頁面引用它嗎? – 2013-04-11 18:21:47

+0

不是沒有重寫。有手動的東西在繼續。寧願現在就離開它。 – sgtz 2013-04-11 18:52:12

0

如果還沒有,你可以在函數中包裝腳本中的任何內容(我們稱之爲doBindings),然後將腳本嵌入到index.html文件(或同等版本)中,以及Knockout,JQuery等。

然後,無論大家認爲你需要得到這些代碼在運行時,添加viewAttached方法向視圖模型,使呼叫doBindings:

activate: function() { 
    ... 
} 
viewAttached: function() { 
    doBindings(); 
} 

將調用函數時的觀點是加載並且DOM是可訪問的。

解決方案在這裏:Insert script tag in Durandal,但在這裏的答案會節省我一些額外的搜索,所以也在這裏添加。