javascript - Browserify Babel ES2015 Knockout 相互依赖模块

标签 javascript knockout.js ecmascript-6 browserify babeljs

我创建了一组单例模块,这些模块加载了各种 knockout 组件,并为其各自的功能区域提供了中央“命令和控制”。我们称它们为 FooModule 和 BarModule

因此,典型的 Knockout 组件将具有

const ko = require('knockout'),
    FooModule =require('../Singletons/FooModel'),
    BarModule =require('../Singletons/BarModel');

这似乎运行良好,每个模块都支持各种可观察值和函数

问题是,我需要 FooModel 才能要求 BarModel,而 BarModel 才能要求 FooModel。

如果它不是单例(例如类),这可能并不重要,但是我不能为每个组件的每个模块都有一个单独的类,否则我将失去跨组件通信的能力(每个页面通常有 3 个-7 个组件,其中一些是重复的,但数据不同)

目前 FooModel 需要 BarModel,反之亦然,但生成的对象是 {},这大概是 Browserify 如何处理相互需要的文件的方式

目前每个单例模块相当于:

FooModel...
    const ko = require('knockout');
    const BarModel = require('./BarModel');
    let hiddenVariable = 42 ;
    const FooModel = {
       FooMonitor : ko.observable(false),
       FooFunction : (variable) => { functionFoo(variable) }
    }
    const functionFoo = (variable) => {
        return variable === hiddenVariable ;
    };
    module.export FooModel ;


BarModel...
    const ko = require('knockout');
    const FooModel = require('./FooModel');
    let hiddenVariable = 24 ;
    const BarModel = {
       BarMonitor : ko.observable(false),
       BarFunction : (variable) => { functionBar(variable) }
    }
    const functionBar = (variable) => {
        return variable === hiddenVariable ;
    };
    module.export BarModel ;

每个 Knockout 组件都需要 FooModel 和 BarModel,但如果我添加

console.info(BarModel)

在 FooModel 模块中,浏览器获取 {}(空对象)

最佳答案

如果 FooModel 需要 BarModel,则 BarModel 不能需要 FooModel。这是模块 bundler 的限制。

Browserify 将自动删除未使用的依赖项。这就是为什么当您开始使用 FooModel 中的 BarModel 时,模块输出仅被剥离为 {}

合并来自 @spender 的评论 - 当您发现循环依赖项时,就该更改架构了。事件是解耦模型的好方法(在这种情况下,使用 KO.postbox 就可以很好地工作)。

关于javascript - Browserify Babel ES2015 Knockout 相互依赖模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35433968/

相关文章:

javascript - 选择 radio 后隐藏 div

javascript - 控制台日志输出整个函数而不是返回的内容

javascript - JQuery通过函数发送ajax

javascript - Knockout.js 动态组合表

Javascript 类语法和在方法中绑定(bind) this

javascript - React.Component 和 Component 有什么区别?

javascript - 如何从 jquery 哈希中获取多个值

asp.net-mvc - 在数组中使用 jqAutocomplete

javascript - 当未观察到底层数据时,Knockout.js 计算写入不会触发突变事件

javascript - 调用导入类的方法时使用 Async/Await