Knockout.js 引用使用$root传递到模板的数据
我有一个模板:Knockout.js 引用使用$root传递到模板的数据,knockout.js,knockout-templating,Knockout.js,Knockout Templating,我有一个模板: <script id="segment-instructions" type="text/html"> <div data-bind="foreach: Conjunctions"> <!-- Deep hierarchy --> <p data-bind="visible: !$root.hasAnyValidExpression($data)" />
<script id="segment-instructions" type="text/html">
<div data-bind="foreach: Conjunctions">
<!-- Deep hierarchy -->
<p data-bind="visible: !$root.hasAnyValidExpression($data)" />
</div>
</script>
问题在于,模板中的$root
被解析为传递给ko.applyBindings
的对象(即具有常规选项
和指令
属性的对象),而不是在模板
绑定中指定的对象,这是我的分段指令model
类的一个实例
我至少可以用两种方法解决这个问题,但我不喜欢其中任何一种:
$root
,但向下遍历到模板渲染的实际视图模型
<p data-bind="visible: !$root.Instructions.hasAnyValidExpression($data)" />
我不喜欢这样,原因很明显(首先,一旦实际模板的视图模型被传递到ko.applyBinding
,它就会停止工作)有没有一种方法可以在模板中继续使用
$root
,而不用担心模板与其使用者向其提供数据的方式之间的紧密耦合?毕竟,使用$parents
数组看起来像是一种方法,只是从底部而不是从顶部进行遍历(这不可靠,请参见上文)。也就是说,在我的情况下
<p data-bind="visible: !$parents[3].hasAnyValidExpression($data)" />
这里是否有明显的遗漏,或者您是否可以执行
?如果$root等于传递到模板中的数据,那么这与使用$root
一样健壮。我真的不理解您在使用$parent
数组时遇到的问题,但是由于您显然只需要再高一级,$parent
就更简单了。旁注:我必须说我的印象是$root确实指向传递到模板中的数据。“你真的,真的确定不会吗?”Hans My bad,我写了这个例子,好像使用$parent
就可以了。在我的情况下不会这样,因为层次结构相当深。使用$parents
数组的问题在于其正确性取决于模板使用者提供模型的准确程度,这是不可接受的。是的,我确信$root
没有指向传递给模板的数据。这可能是一个愚蠢的建议,但是如果您将数据传递给模板,如下所示:数据:{Instructions:Instructions}
。这会使您的新对象成为模板的实际$root吗?也许另一种方法是升级到Knockout 3.2并使用组件?这似乎是您所追求的modulair方法的理想选择@IlyaLuzyanin它显然不会像$root
那样总是指向提供给ko.applyBindings
的任何东西。我只是不确定是否有某种机制可以覆盖,因为特别是在使用模板时,它看起来像是一个典型的问题。
<p data-bind="visible: !$root.Instructions.hasAnyValidExpression($data)" />
<p data-bind="visible: !$parents[$parents.length - 2].hasAnyValidExpression($data)" />
<p data-bind="visible: !$parents[3].hasAnyValidExpression($data)" />