【问题标题】:Prevent Knockout from caching loaded components防止 Knockout 缓存加载的组件
【发布时间】:2020-05-06 17:20:33
【问题描述】:

documentation 说:

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

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

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    您可以使用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);
    

    另外请注意,我没有以任何方式测试此 sn-p,使用此技术需要您自担风险。

    【讨论】:

    • 我试过你的解决方案,没有任何反应。我将组件添加到列表中,但其中的 jsavascript 函数仍然不执行。
    • 谢谢,清除组件中的缓存正是我需要的!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 1970-01-01
      • 2019-03-19
      • 2011-04-02
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多