0

我有一个模板:

<script id="segment-instructions" type="text/html">
    <div data-bind="foreach: Conjunctions">
        <!-- Deep hierarchy -->
            <p data-bind="visible: !$root.hasAnyValidExpression($data)" />             
    </div>
</script>

以及我使用它的以下标记:

<div class="tab-content" id="options-tabs">
    ...
    <div data-bind="template: { name: 'segment-instructions', data: Instructions }"></div>
</div>

这就是我应用绑定的方式:

var instructionsModel = new SegmentInstructionsModel();
...

ko.applyBindings({
    GeneralOptions: generalOptionsModel,
    Instructions: instructionsModel
}, $('#options-tabs').get(0));

问题是$root在模板中被解析为传递给的对象ko.applyBindings(即具有GeneralOptionsInstructions属性的对象),而不是template绑定中指定的对象,这是我的SegmentInstructionsModel类的一个实例。

我至少可以通过两种方式解决这个问题,但我都不喜欢:

  1. 继续$root在模板中使用,但向下遍历到模板渲染的实际视图模型

    <p data-bind="visible: !$root.Instructions.hasAnyValidExpression($data)" />
    

    我不喜欢这样,因为模板不应该担心实际视图模型之上的对象是如何构造的。

  2. 使用$parents数组

    <p data-bind="visible: !$parents[$parents.length - 2].hasAnyValidExpression($data)" />
    

    出于明显的原因,我不喜欢这个(一方面,一旦将实际模板的视图模型传递给它,它就会停止工作ko.applyBinding

有没有办法继续$root在模板中使用,而不用担心模板与其消费者向它提供数据的方式紧密耦合?

4

1 回答 1

0

毕竟,使用$parents数组看起来像是要走的路,只是从底部遍历而不是从顶部遍历(这不可靠,见上文)。也就是说,在我的情况下,它会像

<p data-bind="visible: !$parents[3].hasAnyValidExpression($data)" />
于 2014-08-26T05:17:30.347 回答