【发布时间】:2023-03-05 06:12:01
【问题描述】:
我正在 KnockoutJS 中设计一个“中等”大小的应用程序,我想知道如何在组件之间发送事件。
在 KnockoutJS 中想象一个嵌套的组件层次结构:
Root Viewmodel -> A -> B -> C
-> D
D 如何对来自 C 的消息作出反应?显而易见的 knockoutJS 方法是让 C 写入作为参数传递的 observable,并与 D 共享这个 observable,D 对这个 observable 的变化做出反应。
我不喜欢这种方法的是,A 和 B 需要了解消息,并且 A 和 B 通过其参数主动转发处理程序。使用正常的依赖注入方法,我可以将组件 C 和 D 直接相互连接起来,例如通过在 A 和 B 不知道的情况下将 D 注入 C。
所以我的问题:
- 有没有办法手动连接根视图模型中的组件(例如,通过拦截组件创建)?
或改写:
- 如何在不通过其父组件的情况下从主视图模型配置嵌套组件?
ko.components.register("aaa", {
viewModel: function (params) { this.handler = params.handler; },
template: "<span>A</span> <bbb params='handler: handler'></bbb>"
});
ko.components.register("bbb", {
viewModel: function (params) { this.handler = params.handler; },
template: "<span>B</span> <ccc params='handler: handler'></ccc>"
});
ko.components.register("ccc", {
viewModel: function (params) { this.handler = params.handler; },
template: "<span>C</span> <button data-bind='click: handler'>OK</button>"
});
ko.components.register("ddd", {
viewModel: function (params) {
var self = this;
this.text = ko.observable("No event received!");
if (params.onClick) params.onClick.subscribe(function () {
self.text("Event Received!");
});
},
template: "<span>D</span> <span data-bind='text:text'/>"
});
ko.applyBindings({
onClick: ko.observable()
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<p><aaa params='handler: onClick'> </aaa></p>
<p><ddd params='onClick: onClick'> </ddd></p>
【问题讨论】:
-
您是否考虑过knockout postbox 插件中使用的模式?
-
你如何在
ccc中定义如何从aaa访问方法?通过命名约定?您可以创建某种共享参数组件加载器,但实现如何在ccc中动态找到正确的参数仍然是一个挑战……无论如何,这就是您“中间组件创建”的方式:jsfiddle.net/r7zt4rf9 -
完美 - 毕竟连接组件 ccc 和 ddd 的人需要了解两者的细节。我试图让组件加载器代码正确,但尝试使用默认组件加载器挂钩组件构造函数失败。通过这种方式,主视图模型可以获取任何创建的 ccc 或 ddd 组件的句柄。它的作用取决于应用程序。这将解决我的问题。如果您将该代码放入答案中,我会接受。
-
我添加了一个答案,其中包括一些额外的解释。希望对您有所帮助!
标签: knockout.js custom-component