4

我知道有更好的模式,但在这种情况下,我们希望将一些遗留代码移到视图中。这个 html 有一个

<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

3 回答 3

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 中保持加载状态。这对你来说可能是也可能不是问题。

似乎剥离标签可能是杜兰达尔特有的事情。我还没有弄清楚原因,但如果我有机会深入研究它,我会更新。

于 2013-04-11T20:38:33.407 回答
1

I believe that the durandal view composition engine only uses the first html element in a view and ignores everything else. So if your script tag is outside the main container in your view I think it gets dropped.

Can you post some html/js for review?

于 2013-04-11T16:47:33.803 回答
0

如果还没有,您可以将脚本中发生的任何事情包装在一个函数中(我们称之为 doBindings),然后将脚本与 Knockout、JQuery 等一起嵌入到您的 index.html 文件(或等效文件)中。

然后,在需要运行该代码的任何视图中,将 viewAttached 方法添加到视图模型并调用 doBindings:

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

这将在加载视图并且 DOM 可访问时调用该函数。

此处的解决方案:在 Durandal 中插入 script 标签,但此处的答案会为我节省一些额外的搜索,因此也添加了此处。

于 2013-07-26T09:58:39.807 回答