如何将数据向下传递多层敲除组件

How to pass data down multiple layers of knockout components

我有一种情况,我试图将一些重复的代码包装到组件中。这工作正常,直到我想将一些数据从父范围传递到嵌套在多个其他组件中的组件。

在我的示例中,我希望能够获取顶级范围内的 someobservable 值,一直到 myrow 组件,以在跨度内显示。理想情况下,我不想每次都手动向下传递数据,有没有一种方法可以让数据从父级继承?

顶级范围,我的两个新组件相互嵌套

<mygroup>
    <myrow>
        <span data-bind="text: someobservable()"></span>
    </myrow>
</mygroup>

我可以通过在对象前添加 $context.$parentContext.$parent. 来让它做我想做的事,但理想情况下我不想这样做,因为它会使一切变得非常混乱。

<mygroup>
    <myrow>
        <span data-bind="text: context.$parentContext.$parent.someobservable()"></span>
    </myrow>
</mygroup>

mygroup.js - 我的第一个组件

import template from './mygroup.html';
const ko = require('knockout');

const viewModel = function (params) {
    const self = this;
};

ko.components.register('mygroup', { viewModel, template });

mygroup.html

<div>
    <!-- ko template: { nodes: $componentTemplateNodes } --><!-- /ko -->
</div>

myrow.js - 我的第二个组件

import template from './myrow.html';
const ko = require('knockout');

const viewModel = function (params) {
    const self = this;
};

ko.components.register('myrow', { viewModel, template });

myrow.html

<div>
    <!-- ko template: { nodes: $componentTemplateNodes } --><!-- /ko -->
</div>

我找到了一个我对结果半满意的解决方案,如果有人能提出更好的解决方案,我很乐意听到。

<mygroup params="data: $data">
    <myrow params="data: $data">
        <span data-bind="text: someobservable()"></span>
    </myrow>
</mygroup>

mygroup.js - 我的第一个组件

import template from './mygroup.html';
const ko = require('knockout');

const viewModel = function (params) {
    const self = this;
    this.data = ko.observable(params.data);
};

ko.components.register('mygroup', { viewModel, template });

mygroup.html

<div>
    <!-- ko template: { nodes: $componentTemplateNodes, data: data } --><!-- /ko -->
</div>

myrow.js - 我的第二个组件

import template from './myrow.html';
const ko = require('knockout');

const viewModel = function (params) {
    const self = this;
    this.data = ko.observable(params.data);
};

ko.components.register('myrow', { viewModel, template });

myrow.html

<div>
    <!-- ko template: { nodes: $componentTemplateNodes, data: data } --><!-- /ko -->
</div>