【发布时间】:2019-11-23 08:55:19
【问题描述】:
我需要创建一种方法来动态构建可单独订阅的 observable 数据存储。我使用BehaviorSubject 是因为生成的数据的值可能会发生变化,需要反映。
我正在创建一个模块,用于从如下面的界面形状的数据对象生成SVG 代码。
export interface GraphicElement{
element: string;
elementId: string;
selfClosing?: boolean;
bind?: GraphicBinding; //this property is most relevant to this question
value?: string;
properties: GraphicProperties;
responsiveProperties?: ResponsiveProperties;
}
export interface GraphicBinding{
library: string;
property: string;
}
在我的模块中,我有一个封装所有代码的svg-shell-component,一个将GraphicElement 对象迭代到svg-element-component 的svg-element-component,它生成svg 元素并将其注入到模板中。
可选的bind 属性将让组件知道需要将值绑定到该元素。为了给出一个真实世界的例子来更好地说明我在做什么,我有一个product-spec-component,它显示了产品的图表,其中包含不同尺寸、零件尺寸、开/闭跨度等的测量值,具体取决于产品。 product-data 是与graphic-data 分开的存储区,它包含不同维度的所有测量值,这些测量值将用于生成应在显示测量值的svg-element-component 实例中绑定到的数据。用户还可以在英寸和厘米之间切换,这将更新本示例中绑定的属性的值。
我处理这种情况的方法是使用服务文件来动态生成和设置这些属性,如下面的界面形式。
export interface GraphicBindingData{ [library: string] : GraphicBindingProperty; }
export interface GraphicBindingProperty{ [property:string] : string; }
所以在这个例子中会在服务文件中生成一个类似这样的对象
BindingData: GraphicBindingData = {
specMeasurements:{
width: '2in',
height: '5in',
thickness: '.125in',
depth: '9in'
},
someOtherLibrary:{
somePropA: 'some value',
somePropB: 'some value'
}
}
回到GraphicBinding 接口的GraphicElement 接口中的bind 属性,library 属性将设置为specMeasurements,property 属性将设置为任何一个的名称它需要绑定到的维度。
因此,我们称之为binding-data-service 文件将被导入product-spec-component 以设置此数据,而graphic-element-component 将使用bind 属性中的值来订阅它需要的任何属性.我添加了另一个虚拟数据对象,因为我想展示如何可能存在其他属性对象,以进一步强调是什么让我难以弄清楚如何将BehaviorSubject 应用于这种情况因此,单个库或可能仅在一个库中的单个属性可能会发生变化,而其他一切都保持不变。在这个带有product-spec-component 的示例中,这不是什么大问题,但在如何使用该模块的其他方面,可能会有更多对象具有更深层次的数据。
我正在考虑执行以下操作。
export interface GraphicBindingData{ [library:string] : BehaviorSubject<GraphicBindingProperty>; }
export interface GraphicBindingProperty{ [property:string] : BehaviorSubject<string>; }
在考虑了BehaviorSubject 通常如何被另一个变量观察到然后订阅之后,我不确定如何为每个库中的每个属性创建一个观察者。我也不确定在这种情况下必须如何使用.next() 来更新数据。我一直在尝试查找有关在 BehaviorSubjects 中使用 BehaviorSubjects 的更多信息,如果这对于我想要实现的目标来说是必要的,但找不到任何东西。有人可以帮助我了解如何塑造它,以便我可以订阅和更新各个属性而不影响其他可观察对象吗?
【问题讨论】:
标签: angular typescript rxjs