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)" />