动态设置文章的字段选择
Dynamically set field choices for article
使用 apostrophe-blog,我在 lib\modules\apostrophe-blog\index.js
中添加了几个自定义字段。这些字段之一是 select
列表。但是,我需要根据正在编辑的文章的其他属性动态填充列表值。目前,我正在尝试这个,但管理模式停止工作,所以这看起来不会工作:
module.exports = {
contextual: true,
addFields: [
{
type: 'select',
name: 'featuredIn',
label: 'Featured In:',
choices: []
},
construct: function (self, options) {
self.pageBeforeSend = (req, callback) => {
var featuredIn = self.options.addFields.find(x => x.name === 'featuredIn');
featuredIn.choices = []; //do a lookup from db - self.apos.docs.find(req, { id: ?})
return callback(null);
}
}
};
还有其他方法吗?目前,我不确定我应该挂钩什么事件来设置这些值,也不确定我会在哪里检索正在编辑的文章的文章 ID - self.apos.docs.find(req, { id: ?})
。在此先感谢您的指导。
如你所知,我是 P'unk Avenue 的 Apostrophe 的首席开发人员。
我相信您正试图将一种类型与另一种类型联系起来。这是一个内置功能;你只想加入。
你没有说是什么类型的文档,以及它是什么其他类型的文档"featured in."写起来已经很混乱了(:所以让我举个例子:
- 你有 "shops" 卖东西。
- 您有 "products." 每个产品可能在一个 "shop."
中有特色
- 两者都是 "apostrophe-pieces" 子类,但请记住以下技术也适用于页面类型。
商店架构
addFields: [
{
name: '_products',
type: 'joinByArray',
label: 'Featured:',
withType: 'product',
idsField: 'productIds',
sortable: true
}
]
砰……就是这样。当您编辑商店时,您会自动获得一个字段,允许您自动完成产品名称和 select 它们。然后当您查看商店时,您会发现 ._products
属性 已为您填充。
idsField
属性 只是一个 mongodb 属性 ,它将存储所选产品 ID 的实际数组。您可以给它任何名称,但我们建议使用此命名约定。
注意:对于连接的 name
,您必须使用前导 _
。如果你不这样做,连接最终会存储在数据库中,这是多余的,而且几乎立即过时了。 _
表示 "I am a dynamic, temporary property, don't store me. I'll get calculated again every time I am needed."
从产品端访问商店
到目前为止一切顺利。但有时你有一个产品,你想知道它在哪些商店有特色。没问题:
产品架构
addFields: [
{
name: '_shops',
type: 'joinByArrayReverse',
label: 'Featured In:',
withType: 'shop',
idsField: 'productIds'
}
]
这是一个 "reverse join." 它使 _shops
数组在您有 product
对象时随时可用。它的工作原理是在 productIds
数组中找到包含此产品的商店。
您不能从反向端编辑联接。如果这就是您要进行编辑的结尾,只需更改哪一方有 joinByArray
和哪一方有 joinByArrayReverse
.
希望对您有所帮助!
另请参阅我们的 schema guide,其中详细介绍了联接。
使用 apostrophe-blog,我在 lib\modules\apostrophe-blog\index.js
中添加了几个自定义字段。这些字段之一是 select
列表。但是,我需要根据正在编辑的文章的其他属性动态填充列表值。目前,我正在尝试这个,但管理模式停止工作,所以这看起来不会工作:
module.exports = {
contextual: true,
addFields: [
{
type: 'select',
name: 'featuredIn',
label: 'Featured In:',
choices: []
},
construct: function (self, options) {
self.pageBeforeSend = (req, callback) => {
var featuredIn = self.options.addFields.find(x => x.name === 'featuredIn');
featuredIn.choices = []; //do a lookup from db - self.apos.docs.find(req, { id: ?})
return callback(null);
}
}
};
还有其他方法吗?目前,我不确定我应该挂钩什么事件来设置这些值,也不确定我会在哪里检索正在编辑的文章的文章 ID - self.apos.docs.find(req, { id: ?})
。在此先感谢您的指导。
如你所知,我是 P'unk Avenue 的 Apostrophe 的首席开发人员。
我相信您正试图将一种类型与另一种类型联系起来。这是一个内置功能;你只想加入。
你没有说是什么类型的文档,以及它是什么其他类型的文档"featured in."写起来已经很混乱了(:所以让我举个例子:
- 你有 "shops" 卖东西。
- 您有 "products." 每个产品可能在一个 "shop." 中有特色
- 两者都是 "apostrophe-pieces" 子类,但请记住以下技术也适用于页面类型。
商店架构
addFields: [
{
name: '_products',
type: 'joinByArray',
label: 'Featured:',
withType: 'product',
idsField: 'productIds',
sortable: true
}
]
砰……就是这样。当您编辑商店时,您会自动获得一个字段,允许您自动完成产品名称和 select 它们。然后当您查看商店时,您会发现 ._products
属性 已为您填充。
idsField
属性 只是一个 mongodb 属性 ,它将存储所选产品 ID 的实际数组。您可以给它任何名称,但我们建议使用此命名约定。
注意:对于连接的 name
,您必须使用前导 _
。如果你不这样做,连接最终会存储在数据库中,这是多余的,而且几乎立即过时了。 _
表示 "I am a dynamic, temporary property, don't store me. I'll get calculated again every time I am needed."
从产品端访问商店
到目前为止一切顺利。但有时你有一个产品,你想知道它在哪些商店有特色。没问题:
产品架构
addFields: [
{
name: '_shops',
type: 'joinByArrayReverse',
label: 'Featured In:',
withType: 'shop',
idsField: 'productIds'
}
]
这是一个 "reverse join." 它使 _shops
数组在您有 product
对象时随时可用。它的工作原理是在 productIds
数组中找到包含此产品的商店。
您不能从反向端编辑联接。如果这就是您要进行编辑的结尾,只需更改哪一方有 joinByArray
和哪一方有 joinByArrayReverse
.
希望对您有所帮助!
另请参阅我们的 schema guide,其中详细介绍了联接。