我已经创建了一组单例模块,这些模块可以加载各种敲除组件,并为它们各自的功能区域提供一个中央“命令和控制”。我们叫他们FooModule和BarModule
所以一个典型的淘汰赛组件
const ko = require('knockout'),
FooModule =require('../Singletons/FooModel'),
BarModule =require('../Singletons/BarModel');这似乎工作得很好,每个模块都支持各种可观察性和功能。
问题是,我需要FooModel来要求BarModel,而BarModel需要FooModel。
如果不是Singleton (例如Class),这可能并不重要,但是我不能在每个组件中有一个单独的类,否则我将失去跨组件通信的能力(每个页面通常有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 ;每个淘汰制组件都很高兴地需要FooModel & BarModel,但是如果我添加
console.info(BarModel)在FooModel模块中,浏览器获取{} (空对象)
发布于 2016-02-16 13:52:54
如果FooModel需要BarModel,BarModel就不能要求FooModel。这是一个模块绑定器的限制。
Browserify将自动删除未使用的依赖项。这就是为什么当您开始使用来自{}的BarModel时,模块输出才会被剥离到FooModel。
合并来自@spender的注释--当您发现循环依赖关系时,是时候更改架构了。事件是将模型解耦的好方法(在本例中,使用KO.postbox可以很好地工作)。
发布于 2016-02-16 16:45:20
我想你想要一个同时需要Foo和Bar的控制模块。然后您可以通过传入Bar来初始化Foo,并通过传入Foo来初始化Bar。
https://stackoverflow.com/questions/35433968
复制相似问题