2013-04-11 71 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,但在这里的答案会节省我一些额外的搜索,所以也在这里添加。