我有一个模板:
<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
(即具有GeneralOptions
和Instructions
属性的对象),而不是template
绑定中指定的对象,这是我的SegmentInstructionsModel
类的一个实例。
我至少可以通过两种方式解决这个问题,但我都不喜欢:
继续
$root
在模板中使用,但向下遍历到模板渲染的实际视图模型<p data-bind="visible: !$root.Instructions.hasAnyValidExpression($data)" />
我不喜欢这样,因为模板不应该担心实际视图模型之上的对象是如何构造的。
使用
$parents
数组<p data-bind="visible: !$parents[$parents.length - 2].hasAnyValidExpression($data)" />
出于明显的原因,我不喜欢这个(一方面,一旦将实际模板的视图模型传递给它,它就会停止工作
ko.applyBinding
)
有没有办法继续$root
在模板中使用,而不用担心模板与其消费者向它提供数据的方式紧密耦合?