防止Knockout缓存加载的组件

Prevent Knockout from caching loaded components

本文关键字:组件 加载 缓存 Knockout 防止      更新时间:2023-09-26

文档中说:

可以参考多个组件加载器,直到第一个识别组件名称并提供视图模型/模板。这由于Knockout,每个组件类型只发生一次在内存中缓存结果定义。

问题是我不想只加载一次组件模板,我需要在每次将组件添加到列表中时都这样做。如何防止Knockout只加载一次组件?

您可以使用ko.components.clearCachedDefinition函数,该函数接受组件名称。这个函数清除缓存的组件定义。

作为第一个选项,例如,您可以在组件视图模型构造函数中调用此缓存清除,以便仅对该组件应用此逻辑。

作为第二种选择,如果您全局需要此逻辑,您可以尝试像这样替换原始的ko.components.get函数。注意,这是一种hack,您也应该用最小化的构建来测试它,因为行为可能会有所不同。

ko.components.get = (function(fn) {
  return function(componentName, callback) {
    ko.components.clearCachedDefinition(componentName);
    fn(componentName, callback);
  };
})(ko.components.get);

还请注意,我没有以任何方式测试此代码片段,使用此技术的风险由您自己承担。

如果你想清除所有已注册的组件缓存,你可以使用这个肮脏的hack:

Object.getOwnPropertyNames(ko.components._allRegisteredComponents).forEach(ko.components.clearCachedDefinition);