使用 redux-orm 引导多对多关系
Bootstrapping many to many relationships with redux-orm
我有 Extent
的 aredux-orm 模型,看起来像:
const { string, number, arrayOf, oneOfType, instanceOf } = PropTypes
export default class Extent extends ValidatingModel {}
Extent.fields = {
xmin: attr(),
ymin: attr(),
xmax: attr(),
ymax: attr(),
zoomlevel: attr(),
tooltip: attr(),
tooltipDelay: attr(),
layers: many('Layer', 'extents'),
users: fk('User', 'extents')
}
Extent.propTypes = {
xmin: number,
ymin: number,
xmax: number,
ymax: number,
zoomlevel: number,
tooltip: string,
tooltipdelay: number,
layers: oneOfType([
arrayOf(number),
arrayOf(
instanceOf(Layer)
)
])
}
Extent.modelName = 'Extent'
我有这样定义的相关 Layer
模型:
const {
string,
number,
bool,
any,
oneOfType,
instanceOf
} = PropTypes
export default class Layer extends ValidatingModel {}
Layer.fields = {
objtype: fk('Bo', 'layers'),
layertype: attr(),
label: attr(),
layertypevalue: attr(),
geometrytype: attr(),
opacity: attr(),
token: attr(),
url: attr(),
readonly: attr(),
isFetching: attr(),
'default': fk('LayerConfiguration'),
status: attr(),
enabled: fk('LayerConfiguration', 'enabledLayers'),
highlighted: fk('LayerConfiguration', 'highlightedLayers'),
disabled: fk('LayerConfiguration', 'disabledLayers'),
filtered: fk('LayerConfiguration', 'filteredLayers'),
editing: fk('LayerConfiguration', 'editingLayers')
}
Layer.options = {
idAttribute: 'layerId'
}
我bootstrap他们的数据是这样的:
const victoriaExtent = Extent.create({
xmin: 144.776008,
ymin: -37.8458979,
xmax: 145.101998,
ymax: -37.6845001,
zoom: 15,
tooltip: 'Victoria',
tooltipDelay: 0
})
const transformer = Layer.create({
layerId: 1,
label: 'Transformer',
objtype: 'EQUI',
layertype: 'PLANPLANT',
layertypevalue: '0001',
geometrytype: 'Point',
opacity: 1,
token: null,
url: null,
readonly: false,
extents: [ victoriaExtent ],
status: 'default',
isFetching: false,
'default': null,
enabled: transformerEnabledConfig,
highlighted: highlightPointConfig,
disabled: transformerEnabledConfig,
filtered: transformerEnabledConfig,
editing: editingPointConfig
})
在该状态下,我发现尽管显示 Layer
状态下 extents
有一个 SessionBoundModel
,但该关系并未填充。 ExtentsLayer
关系模型未填充数据。
此外,当我访问范围时,我发现 extent.layers
属性 是 undefined
.
我还不明白为什么(还),但我发现从另一方(这就是它的定义)接近这种关系会产生结果。我将引导程序更改为如下所示:
const victoriaExtent = Extent.create({
xmin: 144.776008,
ymin: -37.8458979,
xmax: 145.101998,
ymax: -37.6845001,
zoom: 15,
tooltip: 'Victoria',
tooltipDelay: 0,
user: spilli,
layers: [
transformer
]
})
当我在 layers
选择器中使用以下语句时,使用这种定义方式:
const layers = layerGroup.layers.toModelArray().map(layer => {
const obj2 = layer.ref
let enabled = layer.enabled
let extents
if (enabled && enabled.icon) {
const enabledRef = enabled.ref
const icon = enabled.icon.ref
enabled = Object.assign({}, enabledRef, { icon })
}
if (layer.extents) {
extents = layer.extents.toRefArray()
}
return Object.assign({}, obj2, { enabled, extents })
})
我有 Extent
的 aredux-orm 模型,看起来像:
const { string, number, arrayOf, oneOfType, instanceOf } = PropTypes
export default class Extent extends ValidatingModel {}
Extent.fields = {
xmin: attr(),
ymin: attr(),
xmax: attr(),
ymax: attr(),
zoomlevel: attr(),
tooltip: attr(),
tooltipDelay: attr(),
layers: many('Layer', 'extents'),
users: fk('User', 'extents')
}
Extent.propTypes = {
xmin: number,
ymin: number,
xmax: number,
ymax: number,
zoomlevel: number,
tooltip: string,
tooltipdelay: number,
layers: oneOfType([
arrayOf(number),
arrayOf(
instanceOf(Layer)
)
])
}
Extent.modelName = 'Extent'
我有这样定义的相关 Layer
模型:
const {
string,
number,
bool,
any,
oneOfType,
instanceOf
} = PropTypes
export default class Layer extends ValidatingModel {}
Layer.fields = {
objtype: fk('Bo', 'layers'),
layertype: attr(),
label: attr(),
layertypevalue: attr(),
geometrytype: attr(),
opacity: attr(),
token: attr(),
url: attr(),
readonly: attr(),
isFetching: attr(),
'default': fk('LayerConfiguration'),
status: attr(),
enabled: fk('LayerConfiguration', 'enabledLayers'),
highlighted: fk('LayerConfiguration', 'highlightedLayers'),
disabled: fk('LayerConfiguration', 'disabledLayers'),
filtered: fk('LayerConfiguration', 'filteredLayers'),
editing: fk('LayerConfiguration', 'editingLayers')
}
Layer.options = {
idAttribute: 'layerId'
}
我bootstrap他们的数据是这样的:
const victoriaExtent = Extent.create({
xmin: 144.776008,
ymin: -37.8458979,
xmax: 145.101998,
ymax: -37.6845001,
zoom: 15,
tooltip: 'Victoria',
tooltipDelay: 0
})
const transformer = Layer.create({
layerId: 1,
label: 'Transformer',
objtype: 'EQUI',
layertype: 'PLANPLANT',
layertypevalue: '0001',
geometrytype: 'Point',
opacity: 1,
token: null,
url: null,
readonly: false,
extents: [ victoriaExtent ],
status: 'default',
isFetching: false,
'default': null,
enabled: transformerEnabledConfig,
highlighted: highlightPointConfig,
disabled: transformerEnabledConfig,
filtered: transformerEnabledConfig,
editing: editingPointConfig
})
在该状态下,我发现尽管显示 Layer
状态下 extents
有一个 SessionBoundModel
,但该关系并未填充。 ExtentsLayer
关系模型未填充数据。
此外,当我访问范围时,我发现 extent.layers
属性 是 undefined
.
我还不明白为什么(还),但我发现从另一方(这就是它的定义)接近这种关系会产生结果。我将引导程序更改为如下所示:
const victoriaExtent = Extent.create({
xmin: 144.776008,
ymin: -37.8458979,
xmax: 145.101998,
ymax: -37.6845001,
zoom: 15,
tooltip: 'Victoria',
tooltipDelay: 0,
user: spilli,
layers: [
transformer
]
})
当我在 layers
选择器中使用以下语句时,使用这种定义方式:
const layers = layerGroup.layers.toModelArray().map(layer => {
const obj2 = layer.ref
let enabled = layer.enabled
let extents
if (enabled && enabled.icon) {
const enabledRef = enabled.ref
const icon = enabled.icon.ref
enabled = Object.assign({}, enabledRef, { icon })
}
if (layer.extents) {
extents = layer.extents.toRefArray()
}
return Object.assign({}, obj2, { enabled, extents })
})