我创建了一组单例模块,这些模块加载了各种 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/