【问题标题】:Dynamically Add Field to Model Keystonejs and Mongodb为模型 Keystonejs 和 Mongodb 动态添加字段
【发布时间】:2017-01-25 19:41:13
【问题描述】:

似乎是一项简单的任务,但我没有看到任何显示如何在 keystone.js 中动态地将字段添加到模型的内容。例如,我有一个“动物”模型,该动物可能属于任意数量的“栖息地”。我希望能够进入动物模型并有一个“分配栖息地”按钮,该按钮将创建一个新字段,将动物与栖息地相关联,根据需要多次。

【问题讨论】:

    标签: mongodb pug keystonejs


    【解决方案1】:

    我认为这可能尚未写入文档,但您想要的是与 Habitats 模型的内联关系。

    如果您将栖息地模型定义为正常,那么您的动物模型应包括以下内容:

    Animal.add({
        fieldA: { type: Types.Relationship, ref: 'Habitat', createInline: true },
    });
    

    【讨论】:

    • 谢谢。这很有帮助,但我仍然需要对字段数进行硬编码。我采用了另一种方法,从函数生成字段。 Habitat.add( function(_animal){ ...}); 不想粘贴整个内容,但基本上它在 Animals 中查找以确定要创建多少个字段。除了它只在编译时生成动物的数量之外,这是可行的。如果我启动服务器并添加新动物,它不会被添加到 Habitats,因为 Habitats 已经编译。有没有办法在管理 ui 中加载创建页面时重新编译模型?
    • 啊,如果您将many: true 添加到我的示例中,您将能够在一个字段中为动物添加任意数量的栖息地。抱歉,我在原始答案中忘记了这一点。在栖息地模型上,您可以制作它,以便您可以从另一侧查看关系(即查看分配给您正在查看的栖息地的所有动物)。这就是你要找的东西吗?
    • 谢谢。这非常有帮助。理想情况下,虽然我想用每个现有动物的布尔复选框填充 Habitats 管理 UI 页面。这基本上与关系下拉列表做同样的事情,但如果它是复选框,它可能更具可读性。我在我的 Habitat 模型中编写了一个函数来执行此操作,但它仅在 keystone 服务器启动时使用新的 Animals 进行更新,而不是每次加载管理 UI 页面时,因此它不会保持最新状态。如果实现这一点需要对 Keystone 进行大量深入的摆弄,我可能会选择关系下拉列表。
    • 好的,是的,这会更复杂。我们正在努力将框架开放给插件架构,以便您可以添加自己的插件,但这还需要一段时间。您说“我可能只使用关系下拉菜单”,所以我认为您可能仍然没有使关系视图起作用。在演示项目中查看this post 底部的关系。可以看到评论关系。用户名demo@keystonejs.com 密码demo。你可以拥有它,以便给你相关的动物?
    • 非常感谢您的支持!真的很感激。搞好关系了如果我理解正确,架构插件可能能够处理填充一定数量的复选框,对吗?因此,在 Habitats 的 pre hook 中,我可以查询 Animals 并为每个动物创建一个复选框?抱歉,我对 keystone 很陌生,所以我可能完全误解了这一点。如果是这样,我会保持简单并坚持使用默认的关系设置。
    【解决方案2】:

    好的,所以我最终做的是设置 keystone restful api 并使用在栖息地页面上运行的 3 个 ajax 请求。

    ajax 请求 #1 – 获取所有动物的名称并使用 jquery 创建带有复选框的 div

    ajax 请求 #2 – 使用包含该栖息地的每个检查动物的 id 的字符串修补栖息地项目

    ajax 请求 #3 – 获取之前已为栖息地选择的活动动物,并在页面加载时预先选中它们的框

    这样做是为当前打开的栖息地项目页面上的每个现有动物动态创建一个复选框。选中动物复选框会将其与当前开放的栖息地相关联。这将保存为为栖息地模型创建的字符串。

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多