【问题标题】:durandal compose and virtual elementsdurandal 组合和虚拟元素
【发布时间】:2014-04-17 01:58:03
【问题描述】:

我正在尝试使用 durandal compose 来加载外部 html 模板,如下所示:

<section>
    <!-- ko with: $root.Table -->
    <table class="input-cells" style="overflow-x:scroll;" data-bind="style: {width:Width},css: {alternateGreyRows: AlternateGreyBackgroundRows }">
        <thead data-bind="foreach: HeaderRows">
            <tr data-bind="foreach: Cells">
                <!-- ko compose:{activationData:$data, model:'../indicators/cellstyles'} --><!-- /ko -->
            </tr>
        </thead>
        <tbody data-bind="foreach: Rows">
            <tr data-bind="foreach: Cells">
                <!-- ko compose:{activationData:$data, model:'../indicators/cellstyles'} --><!-- /ko -->
            </tr>
        </tbody>
    </table>
    <!-- /ko -->
</section>

我的 cellstyles 模块看起来像这样的 HTML:

<!-- ko if: data.Style()=='42' -->   <!-- @* simple text cell*@-->
<td data-bind="attr:{colspan:data.ColSpan, rowspan:data.RowSpan},text:data.Model.Name"></td>
<!-- /ko -->

JS:

define(['plugins/router', 'knockout', 'durandal/global', 'plugins/ajax', 'plugins/formatters'], function (router, ko, global, ajax,formatters) {
    var vm = {};
    vm.formatters = formatters;
    vm.data = {};
    vm.activate = function (data) {
        vm.data = data;
        debugger;
    };

    return vm;
});

cellstyles.html 根目录中的剔除无容器/虚拟元素(if 语句)被忽略(它没有执行并且被视为普通的 HTML 注释,因此 if 内部始终运行)。我做错了什么还是这是一个错误?

以前有人遇到过这种情况吗?

【问题讨论】:

  • 不确定 durandal 是否接受评论作为根元素。尝试将单元格样式包装在 div 中。
  • 你的权利,它似乎没有,但由于我正在构建一个 HTML 表,我不能在行内和 TD 之外有一个 div,因为那不是有效的 HTML。
  • 在你的虚拟 if 语句中将 括起来,让 在你的作文中独立存在。我认为您有条件地显示的不是 ,而是 。根级注释让 Durandal 感到困惑。
  • 你考虑过多体吗?它实际上是有效的 HTML。
  • 单元格样式违反了 Durandal 的规则 视图只有一个根元素(参见durandaljs.com/documentation/Creating-A-View.html)。考虑从视图中删除 if 逻辑并将其放到 cellstyles 视图模型中。

标签: knockout.js durandal


【解决方案1】:

感谢大家提供有用的提示和解决方法,例如多 tbody 建议,以及告诉我它不能与多个根元素一起使用的文档参考。

Compose 用于将模块插入页面,但仅用于将 HTML 插入视图时可能会受到限制。例如,如果你有多个根元素,Durandal 会做一些错误的事情,比如剥离虚拟元素、在不应该去的地方插入 div 等等。

如果像我一样,您的应用程序比此处发布的示例复杂得多,并且您确实需要能够在您需要的地方准确地注入 HTML,而无需在不应该作为hack/workaround,我建议你改为查看文本插件并创建一个模块来配合你的 HTML 并以这种方式做所有事情。它有点复杂,但如果您需要生成所需的 HTML,则很有必要。

Compose 不适用于将 HTML 轻松注入另一个 HTML 文件。然而,文本插件似乎确实可以正常工作,所以我使用它来加载外部 HTML,然后手动插入它。

【讨论】:

  • 其实不是这样的。 Compose 只是将模块插入页面。它可以用来做你想做的事情,Durandal 使用文本插件来实现它。
  • 我在上面发布了一个无法正常工作的示例。如果您需要将 HTML 插入到另一个 HTML 文件中,仅当源文件中只有一个根元素时,compose 才有效。我不明白你上面的评论。这是我试图有条件地显示的 TD(动态列)。每列都有不同的单元格类型,可能包含下拉列表、文本区域、文本等。但是这个具体的例子是无关紧要的,在很多情况下,人们只想在另一个中包含一个 HTML 文件,如 IS,没有任意限制。 Compose 不会这样做。
  • 我们很清楚:我的要求是将任何 html 文件按原样插入到任何其他 html 文件中。那是我无法做到的。如果只有 1 个根元素,我可以做到这一点,但正如我上面所说的那样限制太多,我在很多情况下都没有做到。
  • Compose 允许您将任何 HTML 文件插入到任何其他 HTML 文件中,无论有无激活数据,有或没有视图模型。例如,如果您只使用一个视图进行组合,那么您将按原样注入您的 HTML 文件,其后面没有视图模型。如果您也没有传递激活数据,则您已将任何 HTML 文件插入到任何其他 HTML 文件中。所有 HTML 文件都可以是单根的,而不会改变多根的意图。
  • 这是不正确的。上面 cmets 中发布的文档链接清楚地表明(并且它们是准确的)您不能插入具有多个根元素的 HTML 片段。如果您有多个根元素,它会尝试将它们包装在单个 DIV 中,这可能会导致 HTML 无效,甚至因为它会去除虚拟元素而无法正常工作。我花了很多时间在这上面,我可以肯定地说,如果你需要插入一个带有多个根元素的 html 片段,你不应该使用 compose。在 Durandal 2.0.1 中,这种情况下存在许多错误。
猜你喜欢
相关资源
最近更新 更多
热门标签